更好的办法是在类中转储通用功能。
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")
使用正确的继承关系(如第1例所示),也将有助于你的IDE中推出(如果您正在使用一个)环类型,因为IDE可以确定它期望的对象类型。可以甚至用这样类型的信息增强的功能:
def foo(obj : A):
pass; #do something
即A
冒号之后是一个暗示该函数期望类型或A
亚型的目的的IDE。
因此,根据你我应该使用我暴露在我的问题中的第二个解决方案?但是,我的问题的第一点在技术上可行吗? 我不明白你为什么要添加一个C类,而且我也不明白你的最后一句话,对不起。 – vmonteco