Python 对类中另一个方法的返回值调用方法
所以我想对来自同一类的另一个方法的返回值调用方法Python 对类中另一个方法的返回值调用方法,python,python-3.x,Python,Python 3.x,所以我想对来自同一类的另一个方法的返回值调用方法 class A(): def __init__(self,data): self.data = data def values(self,key): return list(list(x.values())[0] for x in self.data['data'] if key in x.keys()) def length(self): return len(sel
class A():
def __init__(self,data):
self.data = data
def values(self,key):
return list(list(x.values())[0] for x in self.data['data'] if key in x.keys())
def length(self):
return len(self)
data ={"data":[{"country":"india"},{"state":"punjab"},{"country":"usa"}]}
obj = A(data)
res = obj.values('country') # returns ['india', 'usa']
res1 = obj.values('country').length() # returns AttributeError: 'list' object has no attribute 'length'
print(res)
print(res1)
我希望res和res1都能工作
我也尝试过使用@property decorator
class B():
def __init__(self,data):
self.data = data
def __call__(self, key):
self.key = key
return self
@property
def values(self):
self.valu = list(list(x.values())[0] for x in self.data['data'] if self.key in x.keys())
return self
def length(self):
return len(self.valu)
data ={"data":[{"country":"india"},{"state":"punjab"},{"country":"usa"}]}
obj = B(data)
res = obj('country').values.length() # returns 2
res1 = obj('country').values # returns <__main__.A object at 0x103a9fbe0>
print(res)
print(res1)
class B():
定义初始化(自身,数据):
self.data=数据
定义呼叫(自身,键):
self.key=key
回归自我
@财产
def值(自身):
self.valu=list(如果self.key位于x.keys()中,则self.data['data']中x的列表(x.values())[0]
回归自我
def长度(自身):
返回len(self.valu)
数据={“数据”:[{“国家”:“印度”},{“州”:“旁遮普”},{“国家”:“美国”}]}
obj=B(数据)
res=obj('country').values.length()#返回2
res1=obj('country')。值#返回
打印(res)
打印(res1)
这样res工作,但res1不工作
谢谢。length()不是python的列表函数。改用len(listobject)
例如:
len(obj(“国家”)。值)
如果要打印这些值。在第二个示例中:
#使用
res1=obj(“国家”)。数据
#而不是
res1=obj(“国家”)。数值
使用以下代码获取国家/地区列表
res1=[[u dict.get('country')表示obj('country')中的'u dict.data.get('data'),如果'u dict.key()中的'country']
打印(res1)
#[‘印度’、‘美国’]
最终更新的工作代码:
class B():
定义初始化(自身,数据):
self.data=数据
定义呼叫(自身,键):
self.key=key
回归自我
@财产
def值(自身):
self.valu=list(如果self.key位于x.keys()中,则self.data['data']中x的列表(x.values())[0]
回归自我
def长度(自身):
返回len(self.valu)
数据={“数据”:[{“国家”:“印度”},{“州”:“旁遮普”},{“国家”:“美国”}]}
obj=B(数据)
res=obj('country').values.length()#返回2
res1=[[u dict.get('country')表示obj('country')。data.get('data'),如果[u dict.keys()]中的'country',则返回['usa','india']
打印(res)
打印(res1)
.length()
不是python列表函数。改用len(listobject)
例如:
len(obj(“国家”)。值)
如果要打印这些值。在第二个示例中:
#使用
res1=obj(“国家”)。数据
#而不是
res1=obj(“国家”)。数值
使用以下代码获取国家/地区列表
res1=[[u dict.get('country')表示obj('country')中的'u dict.data.get('data'),如果'u dict.key()中的'country']
打印(res1)
#[‘印度’、‘美国’]
最终更新的工作代码:
class B():
定义初始化(自身,数据):
self.data=数据
定义呼叫(自身,键):
self.key=key
回归自我
@财产
def值(自身):
self.valu=list(如果self.key位于x.keys()中,则self.data['data']中x的列表(x.values())[0]
回归自我
def长度(自身):
返回len(self.valu)
数据={“数据”:[{“国家”:“印度”},{“州”:“旁遮普”},{“国家”:“美国”}]}
obj=B(数据)
res=obj('country').values.length()#返回2
res1=[[u dict.get('country')表示obj('country')。data.get('data'),如果[u dict.keys()]中的'country',则返回['usa','india']
打印(res)
打印(res1)
我认为这里的困惑在于调用的.length
方法是什么对象。在第一种情况下,它在没有.length
方法的列表上调用。在第二种情况下,它在B
对象上调用,该对象实际上具有.length
方法。最直接和首选的解决方案是@Subhrajyoti Das建议的解决方案
如果您仍然希望代码(如问题中所述)正常工作(或者只是想知道这是否可以实现),可以定义一个自定义列表对象,如下所示:
class CustomList(list):
def length(self):
return len(self)
现在,您不需要创建一个列表
,而需要创建一个自定义列表
编辑:添加注释中要求的完整示例
class CustomList(list):
def length(self):
return len(self)
class A():
def __init__(self,data):
self.data = data
def values(self,key):
return CustomList(CustomList(x.values())[0] for x in self.data['data'] if key in x.keys())
def length(self):
return len(self)
data ={"data":[{"country":"india"},{"state":"punjab"},{"country":"usa"}]}
obj = A(data)
res = obj.values('country') # returns ['india', 'usa']
res1 = obj.values('country').length() # 2
object has no attribute 'length'
print(res)
print(res1)
我认为这里的困惑在于调用的.length
方法是什么对象。在第一种情况下,它在没有.length
方法的列表上调用。在第二种情况下,它在B
对象上调用,该对象实际上具有.length
方法。最直接和首选的解决方案是@Subhrajyoti Das建议的解决方案
如果您仍然希望代码(如问题中所述)正常工作(或者只是想知道这是否可以实现),可以定义一个自定义列表对象,如下所示:
class CustomList(list):
def length(self):
return len(self)
现在,您不需要创建一个列表
,而需要创建一个自定义列表
编辑:添加注释中要求的完整示例
class CustomList(list):
def length(self):
return len(self)
class A():
def __init__(self,data):
self.data = data
def values(self,key):
return CustomList(CustomList(x.values())[0] for x in self.data['data'] if key in x.keys())
def length(self):
return len(self)
data ={"data":[{"country":"india"},{"state":"punjab"},{"country":"usa"}]}
obj = A(data)
res = obj.values('country') # returns ['india', 'usa']
res1 = obj.values('country').length() # 2
object has no attribute 'length'
print(res)
print(res1)
我知道。我正在做的是制作自定义方法的列表,并将调用这些方法objects@RustamSinghGargobj.values('country')
返回一个列表,您没有list.obj('country')的.length()
。数据返回整个数据。我想要的是['india','usa']获取错误:AttributeError:'list'对象没有属性'length',我知道。我正在做的是创建自定义方法的列表,并将调用这些方法objects@RustamSinghGargobj.values('country')
返回一个列表,而您没有list.obj('country')的.length().data返回整个数据。我想要的是['india','usa']获取错误:AttributeError:'list'对象没有属性'length',如果您想调用B.length
的返回值values
,那么它必须返回B
的实例。您不能期望列表了解B
methods.add res1=obj('country')。values.valu这应该有效。obj('country')。值返回self对象,您可以访问您在该对象上设置的任何属性。如果要对值的返回值调用B.length
,则它必须返回B
的实例。你不能和我约会