类Square
的任何实例都以等于2的整数开头。当对实例调用square_me
方法时,该实例将与自身相乘。这可以进行任意次数(例如,在一个实例上调用square_me
一次会得到值4,在同一实例上再次调用square_me
会得到值16,等等(
class Square:
def __init__(self):
self.integer = 2
def square_me(self):
self.integer = self.integer * self.integer
def get_me(self):
return self.integer
n1 = Square()
n2 = Square()
n3 = Square()
n1.square_me()
val1 = n1.get_me()
print(val1) # 4
n2.square_me()
n2.square_me()
val2 = n2.get_me()
print(val2) # 16
这很简单,但是,我还希望类Square
跟踪所有实例的总值。这个总值应该可以通过类以及任何实例获得。
例如:
print(val1) # 4
print(val2) # 16
print(Square.total) # 20
我尝试将每个实例添加到字典中,并对其中的值求和。虽然我可以对类外的字典值求和,并用print(sum(Square.instances.values()))
得到正确答案,但我想设计它,使类Square
跟踪所有实例的总值。相反,它只是打印:
<function Square.get_total at 0x000001CADA21B0D0>
我觉得我已经接近解决方案,但需要一些指导。这是我的代码:
class Square:
instances = {}
total = sum(instances.values())
def __init__(self):
self.integer = 2
def square_me(self):
self.integer = self.integer * self.integer
self.instances[self] = (self.integer)
def get_total(self):
return self.total
def get_me(self):
return self.integer
n1 = Square()
n2 = Square()
n1.square_me()
val1 = n1.get_me()
print(val1) # 4
n2.square_me()
n2.square_me()
val2 = n2.get_me()
print(val2) # 16
print(Square.instances) # Print the dictionary.
print(sum(Square.instances.values())) # This works.
print(Square.get_total) # This does not work.
Square.get_total
是一个函数。你需要Square.get_total()
。在这种情况下,get_total
不会得到self
参数。此外,您从未更新total
,因此它将返回任何内容。您需要get_total
才能执行return sum(Square.instances.values())
。此外,您还希望在初始化期间将实例存储在列表中,而不仅仅是在square_me
调用之后。像这样:
class Square:
instances = {}
def __init__(self):
self.integer = 2
Square.instances[self] = self.integer
def square_me(self):
self.integer = self.integer * self.integer
Square.instances[self] = self.integer
@classmethod
def get_total(cls):
return sum(cls.instances.values())
def get_me(self):
return self.integer
n1 = Square()
n2 = Square()
n1.square_me()
val1 = n1.get_me()
print(val1) # 4
n2.square_me()
n2.square_me()
val2 = n2.get_me()
print(val2) # 16
print(sum(Square.instances.values())) # This works.
print(Square.get_total()) # This does not work.
输出:
4
16
20
20