如何使用@property返回列表

2024-09-30 02:22:48 发布

您现在位置:Python中文网/ 问答频道 /正文

如何使用属性从类级别返回列表?当调用实例类时,一切正常,但是当它调用属性类时,它得到属性对象

以下示例代码:

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>

Tags: nameselfage属性objectdefcountproperty
2条回答

在调用类属性时,首先需要将该类实例化到一个对象中,然后获取该对象的属性。你知道吗

这和预期的一样。因为您是在类上调用属性对象,而不是在实例上调用属性对象。类不包含与类实例相同的数据。你知道吗

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

因此,我稍微修改了您的代码,使其能够处理类属性而不是实例属性。你知道吗

上面I定义classproperty decorator

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>]

很有魅力!你知道吗

相关问题 更多 >

    热门问题