Skip to main content
 首页 » 编程设计

python之帮助python继承

2025年05月04日18jyk

给定一个任意对象:

class Val(object): 
    def __init__(self): 
        this_val = 123 

我想创建一个抽象基类,它有一个 Val() 属性:

class A(object): 
    foo = Val() 

我希望当我的 child 继承那个类时,他们会得到 Val() 的副本。例如:

class B(A): 
    pass 
class C(A): 
    pass 

我希望有以下行为:

>>> b = B() 
>>> c = C() 
>>> c.foo.this_val = 456 
>>> b.foo.this_val 
123 

但我得到的是:

>>> b.this_val 
456 

我知道我可以将 self.foo = Val() 放入 init 来实现该行为,但我有一个要求 foo 仍然是一个属性(它是 django 中的模型经理)。任何人都可以建议解决这个问题吗?

编辑:我真的需要能够访问作为类属性的值,所以我想要的行为是:

>>> C.foo.this_val = 456 
>>> B.foo.this_val 
123 

请您参考如下方法:

属性 foo 仅 存在于 A 上。您必须使用元类向每个类添加新的 Val。

class Val(object): 
    def __init__(self): 
        self.this_val = 123 
 
class MC(type): 
  def __init__(self, name, bases, d): 
    super(MC, self).__init__(name, bases, d) 
    self.foo = Val() 
 
class A(object): 
  __metaclass__ = MC 
 
class B(A): 
  pass 
 
B.foo.this_val = 456 
print A.foo.this_val 
print B.foo.this_val