如何将类的所有实例相加.该总值将通过类以及任何实例获得

  • 本文关键字:实例 任何 python python-3.x class oop
  • 更新时间 :
  • 英文 :


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

相关内容

最新更新