对类中另一个方法的返回值调用方法



所以我想对来自同一类的另一个方法的返回值调用方法。

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装饰器

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)

这样 res 可以工作,但 res1 不起作用。

谢谢

.length()不是python列表函数。请改用len(listobject)

例如:

len(obj('country').values)

如果要打印值。在第二个示例中:

#Use 
res1 = obj('country').data
#instead of
res1 = obj('country').values

使用以下代码获取国家/地区列表


res1 = [_dict.get('country') for _dict in obj('country').data.get('data') if 'country' in _dict.keys()]
print(res1)
#['india', 'usa']

最终更新的工作代码:

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 = [_dict.get('country') for _dict in obj('country').data.get('data') if 'country' in _dict.keys()]      # returns ['usa', 'india']
print(res)
print(res1)

我认为这里的混淆在于调用.length方法的对象。在第一种情况下,它是在没有.length方法的list上调用的。在第二种情况下,它在确实具有.length方法的B对象上调用。最直接和首选的解决方案是@Subhrajyoti Das建议的。

如果您仍然希望代码(如问题中所述(正常工作(或者只是想知道这是否真的可以完成(,则可以定义一个自定义列表对象

,如下所示:
class CustomList(list):
    def length(self):
        return len(self)

现在,与其制作list,不如制作CustomList

编辑:根据注释中的要求添加完整示例。

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)

最新更新