在python中调用__init__中的静态方法或属性

时间:2015-08-29 09:29:06

标签: python

我有很多问题! 看看这段代码plz:

class Dog(object):
    _the_most_oldest = int()

    def __init__(self,age):
        self.age=age


    @staticmethod   
    @property
    def the_most_oldest(age):
        if Dog._the_most_oldest < age:
            Dog._the_most_oldest=age
        return Dog._the_most_oldest

1:

是否属性可能是静态方法? 因为我需要一个在实例之间共享的真正静态var - &gt; _the_most_oldest狗! =&GT;所以我需要@property。因为the_most_oldest(age)方法不适用于任何特殊实例,我需要@staticmethod!

2:

我需要做的第二件事是在每个实例中调用the_most_oldest shuold并计算并刷新_the_most_oldest var。怎么办? 这有错误:

def __init__(self,age):
    self.age=age
    the_most_oldest(self.age)

2 个答案:

答案 0 :(得分:2)

  1. 在我的位置,我会初始化_the_most_oldest = 0(也许称之为_the_oldest,更好的英语)
  2. Python中的@staticmethod只是一个“包含在类中”的函数,我认为使用@classmethod会更好。
  3. 如果要为属性分配值,则无法使用装饰器,则需要传递setter和getter方法。
  4. def _get_oldest(self):
            return self._the_oldest

    def _set_oldest(self, age): if Dog._the_oldest < age: Dog._the_oldest=age the_oldest = property(_get_oldest, _set_oldest)

答案 1 :(得分:2)

不,属性不能是静态方法(它不是一种方法descriptor)。

创建将保存该类的所有实例的类属性。

class Dog(object):
    _dogs = []

并将新实例放入_dogs类属性。

def __init__(self, age):
    self._dogs.append(self)
    self.age = age

然后创建classmethod the_most_oldest。这将计算所有实例中最老的狗。

@classmethod
def the_most_oldest(cls):
    return max(cls._dogs, key=lambda dog: dog.age)