仅当基类不是Python中的子类时才调用基类
我需要编写一个基类(在本例中为类a),它很可能(但并非总是)被子类化。我只想在基类没有子类时从基类调用'Run'方法,否则只从子类调用'Run'方法 这就是我所拥有的,它似乎有效,但我想知道是否有一种更简单或更具蟒蛇式的方法仅当基类不是Python中的子类时才调用基类,python,oop,methods,subclass,Python,Oop,Methods,Subclass,我需要编写一个基类(在本例中为类a),它很可能(但并非总是)被子类化。我只想在基类没有子类时从基类调用'Run'方法,否则只从子类调用'Run'方法 这就是我所拥有的,它似乎有效,但我想知道是否有一种更简单或更具蟒蛇式的方法 class A(object): def __init__(self): pass def Run(self): print "Calling A.Run()" class B(A): def __init__(s
class A(object):
def __init__(self):
pass
def Run(self):
print "Calling A.Run()"
class B(A):
def __init__(self):
A.__init__(self)
pass
def Run(self):
print "Calling B.Run()"
subs = A.__subclasses__()
if subs: inst = [i() for i in subs]
else: inst = [A()]
[each.Run() for each in inst]
我只想在基类没有子类时从基类调用'Run'方法,否则只从子类调用'Run'方法
这是默认情况下发生的,调用最具体的方法
如果您确实不想从子类中获得基方法,可以编写如下代码:
class C(object):
def Run(self):
if self.__class__ != C:
raise NotImplementedError("You need to override this method")
您所做的看起来是正确的,除了大多数程序员会看到B.Run方法并想:“哦,他忘了调用super。让我补充一下……”但我相信您会解释您在实际实现中所做的工作:) <>如果你担心C++中的切片,那么放心吧。你所拥有的是好的
至于让它变得“更简单”,我不知道除了删除A的空
\uuuuuu init\uuuuu
函数和删除B的\uuuuu init\uuuuuu中的pass
之外,如果我导入基类,然后导入任何可能为其子类的类,你还能如何简化它;如果没有从基类(A.Run())派生任何其他导入的方法,我仍然需要调用基类(A.Run())方法,并且在导入所有内容之前,我不知道是否存在任何子类。在实际实现中,\uu init\uu()
方法中可能会有实际的代码。我只是加入了pass
版本,以确保我做得正确:)