如果我有以下内容:
class A:
attrs = [...]
A_attr = [...]
class B(A):
B_attr = [...]
有没有办法阻止我的B
子类继承A_attr
类的A
?
或者这会被认为是一个糟糕的设计,我应该更好地从包含所有A
属性的第三个B
类中继承C
和attrs
并添加特定的像这样属于每个子类?
class C:
attrs = [...]
class A(C):
A_attr = [...]
class B(C):
B_attr = [...]
答案 0 :(得分:0)
更好的想法是将常用功能转储到类中。
class Commmon:
attrs = [...]
扩展这个想要这种额外功能的课程。
class A(Common):
# only one attribute added in this class
A_attr = [...]
classB(Common):
attrs_B = [...]
在类中需要额外属性时扩展类A
,这将带来所有其他属性。
class C(A):
attrs_C = [...]
这将允许您希望类型为Common
的对象的任何地方,您可以提供B
以及C
的实例。无论您想要哪个类A
的实例,都可以提供C
的实例。 如果您在每个子类中添加特定实例,则无法执行此操作。
来自评论
所以根据你的说法,我应该使用我在问题中公开的第二个解决方案。
否强>
我建议不要在每个子类中添加属性,而是将属性添加到单独的类中,让新类继承此中间类。因此,您不必在每个子类中添加特定属性。
上面已经提供了示例。让我们看看这样做有什么好处,而不是你的建议。采取以下功能
def foo(obj):
# check to make sure object has the specific attribute
if (isinstance(obj, A)):
pass; #do something
else:
raise TypeError("Object is not an instance of A")
但是如果我们在每个类中添加特定属性,则需要将该方法更改为:
def foo(obj):
# check to make sure object has the those type which has that specific attribute
if( isinstance(obj, class1) or (isinstance(obj, class2) or ...):
pass; #do something
else:
raise TypeError("Object does not have specific attribute")
当然,您可以使用以下内容执行检查:
def foo(obj):
# check to make sure obj has attribute
if hasattr(obj, 'property')
pass; # do something
else:
raise TypeError("Object does not have necessary attribute")
使用正确的继承关系(如第一个示例所示)也可以帮助IDE(如果使用的话)推断类型,因为IDE可以确定它所期望的对象类型。你可以甚至用这样的类型信息扩充函数:
def foo(obj : A):
pass; #do something
冒号后A
提示IDE,该函数需要类型或子类型为A
的对象。