考虑下面的类:
class cell:
X_size = 10
Y_size = 10
world = np.zeros((X_size,Y_size))
我想将上面的类更改为下面的代码并能够传递X_size, Y_size
给一个实例:
class cell:
world = np.zeros((X_size,Y_size))#X_size and Y_size must be passed on the run time
我可以做:
class cell:
def __init__(self, X_size,Y_size):
self.X_size = X_size
self.Y_size = Y_size
world = np.zeros((X_size,Y_size))
问题是每个实例都会生成一个新的world
. 我希望world
创建一次,所有实例都可以看到,然后每个新实例只修改世界中的一个元素,所有其他实例也可以看到这些元素。这就是为什么我使用的类变量,但当时如果我使用类变量,看来我必须确定X_size
和Y_size
前手。
要将参数传递给类声明,必须使用__init_subclass__
(参见此处)或元类声明超类。
__init_subclass__
是实现您所描述的最直接的方法:
class BaseCell:
def __init_subclass__(cls, *, X_size, Y_size):
cls.world = np.zeros((X_size, Y_size))
这可以让你的尺寸参数传递给子类的BaseCell
,就像这样:
class MyCell(BaseCell, X_size=10, Y_size=10):
pass
cells = [MyCell(), MyCell()]
assert cells[0].world is cells[1].world
assert len(cells[0].world) == 10
assert len(cells[0].world[0]) == 10
然后所有的实例MyCell
将共享一个world
类属性,宽度为 10,高度为 10。
注意:根据您尝试实现的更广泛的上下文,可能只是将 传递world
给每个实例构造函数可能是更合适的方法(请参阅依赖倒置)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句