【发布时间】:2022-01-12 17:57:40
【问题描述】:
与往常一样,我首先要说我在任何意义上都不是专家或专业人士,所以请温柔地评判我。不幸的是,我找不到这个问题的解决方案,但我敢肯定这不是第一次出现在这里。因此,如果您将我推荐给相关线程,我将不胜感激。
我有一个 12 层的类和子类结构。比如:
class A:
pass
class B(A):
pass
#class M,N,O(A)....
class C(B):
pass
等等。
每个类和子类可能有也可能没有(通常它们确实有)一个属性(memory['prop'])。并且任何对象的每个 init 都引用它的超类。
class A:
memory={'prop':{'a':0,'b':1}}
def __init__(self,**kwargs):
for k in kwargs|self.memory['prop']:
if k not in self.__dict__:
setattr(self,k,(kwargs|self.memory['prop'])[k])
class B(A):
def __init__(self,**kwargs):
super().__init__(**kwargs)
for k in self.memory['prop']:
if k not in self.__dict__:
setattr(self,k,(self.memory['prop'])[k])
class C(B):
memory={'prop':{'c':2,'d':3}}
def __init__(self,**kwargs):
super().__init__(**kwargs)
for k in self.memory['prop']:
if k not in self.__dict__:
setattr(self,k,(self.memory['prop'])[k])
这里的问题是,如果我创建一个 C 对象,它会在每次算法调用 init 函数中的变量时调用 C.memory['prop']。我需要的是调用“当前”类内存。
在示例中,如果我运行object=C(**{'e'=4}),我将获得一个具有'c'、'd' 和'e' 属性的对象,但不是'a' 或'b'。
我知道我可以通过以下方式做到这一点:
class A:
memory={'prop':{'a':0,'b':1}}
def __init__(self,**kwargs):
for k in kwargs|A.memory['prop']:
if k not in self.__dict__:
setattr(self,k,(kwargs|A.memory['prop'])[k])
class B(A):
def __init__(self,**kwargs):
super().__init__(**kwargs)
for k in B.memory['prop']:
if k not in self.__dict__:
setattr(self,k,(B.memory['prop'])[k])
class C(B):
memory={'prop':{'c':2,'d':3}}
def __init__(self,**kwargs):
super().__init__(**kwargs)
for k in C.memory['prop']:
if k not in self.__dict__:
setattr(self,k,(C.memory['prop'])[k])
但这意味着我每次定义一个类时都必须做额外的工作(大约有一千个)
我也可以这样做:
class A:
memory={'prop':{'a':0,'b':1}}
def __init__(self,clas,**kwargs):
for k in kwargs|clas.memory['prop']:
if k not in self.__dict__:
setattr(self,k,(kwargs|clas.memory['prop'])[k])
class B(A):
def __init__(self,clas,**kwargs):
super().__init__(clas,**kwargs)
for k in clas.memory['prop']:
if k not in self.__dict__:
setattr(self,k,(clas.memory['prop'])[k])
class C(B):
memory={'prop':{'c':2,'d':3}}
def __init__(self,clas,**kwargs):
super().__init__(clas,**kwargs)
for k in clas.memory['prop']:
if k not in self.__dict__:
setattr(self,k,(clas.memory['prop'])[k])
但这意味着我每次创建一个看起来错误的对象object=C(C)时都必须调用同一个类。
最好的方法是什么?
【问题讨论】:
-
变量可以引用为
A.memory、B.memory等 -
如果你不希望子类覆盖它,那么使用相同的变量名有什么意义呢?
-
“我有一个 12 层的类和子类结构”听起来像是一个错误的设计……你真正的目标是什么?
-
@AKX 为什么?我正在建模类似于分类学的东西,如果我对生物进行分类,构建一个 8 层的结构会不会是错误的?
-
@AKX。同意。这里有很多代码气味。循环执行
(kwargs|clas.memory['prop'])[k]真的很困扰我。
标签: python class inheritance subclass init