【问题标题】:How to return a list using @property如何使用@property 返回列表
【发布时间】:2019-09-15 10:42:40
【问题描述】:

如何使用属性从类级别返回列表?调用instance类的时候没问题,但是调用属性类的时候获取的是property对象

下面的示例代码:

class zoo:
    __count_animals=0
    __listAnimals=[]

    def __init__(self,typee,name,age):
        self.typee=typee
        self.name=name
        self.age=age
        self.__listAnimals.append(self)
        zoo.__count_animals+=1


    @property
    def count_animals(self):
        return self.__count_animals

    @count_animals.setter
    def count_animals(self,newvalue):
        newvalue=zoo.__ilosc_zwierzat
        self.__count_animals=newvalue

    @property
    def listAnimals(self):
        return  self.__listAnimals

    @listAnimals.setter
    def listAnimals(self,newobj):
        newobj=zoo.__listAnimals
        self.__listAnimals=newobj
  zw1=zoo("Tiger","NoName",23)
  print(zw1.listAnimals) # result it's ok ->[<__main__.zoo object at 0x006A23D0>, <__main__.zoo object at 0x006A2410>]

  but
  print(zoo.listAnimals) # result <property object at 0x002A1DB0>

【问题讨论】:

标签: python


【解决方案1】:

这按预期工作。因为您在类而不是实例上调用属性对象。类不包含与类实例相同的数据。

您期望它发生的方式是__count_animals__listAnimals 是类属性而不是实例属性。

所以我稍微修改了您的代码以使用类属性而不是实例属性。

上面我定义类属性装饰器

class classproperty(object):
    def __init__(self, f):
        self.f = f

    def __get__(self, obj, owner):
        return self.f(owner)

那么你的班级动物园

class zoo:
    __count_animals=0
    __listAnimals=[]

    def __init__(self,typee,name,age):
        self.typee=typee
        self.name=name
        self.age=age
        zoo.__listAnimals.append(self)
        zoo.__count_animals+=1

    @classproperty
    def count_animals(self):
        return self.__count_animals

    @classproperty
    def listAnimals(cls):
        return cls.__listAnimals


zw1=zoo("Tiger","NoName",23)
print(zoo.listAnimals) # result [<__main__.zoo object at 0x10699c410>]

像魅力一样工作!

【讨论】:

    【解决方案2】:

    您正在调用类属性,您需要先将该类实例化到一个对象中,然后获取该对象的属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-05
      • 2015-11-11
      • 2021-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多