Python,自动向子类添加属性
我想自动将属性添加到从类A继承的一些对象中。 这些对象只能从包含我要复制的属性的另一个对象实例化:Python,自动向子类添加属性,python,inheritance,Python,Inheritance,我想自动将属性添加到从类A继承的一些对象中。 这些对象只能从包含我要复制的属性的另一个对象实例化: class A(object): pass class B(A): pass class C(object): pass class MyClass(MySuperClass): def __init__(self): MySuperClass.__init__(self) b = B() hasattr(b,
class A(object):
pass
class B(A):
pass
class C(object):
pass
class MyClass(MySuperClass):
def __init__(self):
MySuperClass.__init__(self)
b = B()
hasattr(b, "my_attribut") # True
c = C()
hasattr(c, "my_attribut") # False, doesn't inherit from A
b = B() # Raise error, this object can't be instantiated here.
可能使用元类?类属性
如果您想添加一个类属性,那么您确实可以使用一个只影响子类行为的元类
class MetaA(type):
def __new__(cls, name, bases, name_space):
# Metaclass does nothing for A
if not bases:
return type.__new__(cls, name, bases, name_space)
# Metaclass adds a class attribute to anything that inherits A
else:
return super().__new__(cls, name, bases, dict(name_space, my_attribute='foo'))
class A(metaclass=MetaA):
pass
class B(A):
pass
hasattr(A, "my_attribute") # False
hasattr(B, "my_attribute") # True
实例属性
如果您希望对象具有实例属性(如果它们的类继承自A
),那么元类将不会这样做。您可以在a.\uuu init\uuu
中使用条件语句
class A:
def __init__(self):
if type(self) != A:
self.my_attribute = 'foo'
class B(A):
pass
hasattr(A(), "my_attribute") # False
hasattr(B(), "my_attribute") # True
是否让构造函数接受要从中复制的对象
b=b(self)
我不想使用构造函数=)你为什么不想使用构造函数?听起来可能是一个-你能解释一下你试图用这种复杂方法解决的实际问题吗?@Dbi:你说的“另一个解决方案”是什么意思?你没有解决办法。