编写一个引用实例和类的python方法

时间:2017-04-13 21:13:14

标签: python oop class-method

我们假设我们在Python中有一个Pet类:

class Pet(object):
    num_pets = 0

    def __init__(self, name):
        self.name = name
        Pet.num_pets += 1

    def speak(self):
        print("My name's %s and the number of pets is %d" % (self.name, self.num_pets))

我希望 init 方法创建实例,但也要更新类的属性。有没有比上面的代码更优雅的方式来做到这一点?我尝试将selfcls传递给init方法,然后引用cls而不是pet,其中num_pets递增,但这并不起作用。

3 个答案:

答案 0 :(得分:13)

您可以使用classmethod来增加宠物数量:

class Pet(object):
    num_pets = 0

    def __init__(self, name):
        self.name = name
        self.incr_num_pets()

    @classmethod
    def incr_num_pets(cls):
        cls.num_pets += 1

或者,您可以在num_pets上增加type(self)

def __init__(self, name):
    self.name = name
    type(self).num_pets += 1

虽然我发现第二种方法虽然输入较少,但稍微不那么优雅。

答案 1 :(得分:4)

在您的情况下,您可以将__new____init__一起使用:

class Pet(object):
    num_pets = 0

    def __new__(cls, *args, **kwargs):
        cls.num_pets += 1
        return object.__new__(cls)

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

答案 2 :(得分:1)

您可以使用self.__class__访问自己的班级,这意味着您的__init__可能如下:

def __init__(self, name):
    self.name = name
    self.__class__.num_pets += 1