我们假设我们在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 方法创建实例,但也要更新类的属性。有没有比上面的代码更优雅的方式来做到这一点?我尝试将self
和cls
传递给init方法,然后引用cls而不是pet,其中num_pets递增,但这并不起作用。
答案 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