Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对类中另一个方法的返回值调用方法_Python_Python 3.x - Fatal编程技术网

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@RustamSinghGarg
obj.values('country')
返回一个列表,您没有list.obj('country')的
.length()
。数据返回整个数据。我想要的是['india','usa']获取错误:AttributeError:'list'对象没有属性'length',我知道。我正在做的是创建自定义方法的列表,并将调用这些方法objects@RustamSinghGarg
obj.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
的实例。你不能和我约会