Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅当基类不是Python中的子类时才调用基类_Python_Oop_Methods_Subclass - Fatal编程技术网

仅当基类不是Python中的子类时才调用基类

仅当基类不是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

我需要编写一个基类(在本例中为类a),它很可能(但并非总是)被子类化。我只想在基类没有子类时从基类调用'Run'方法,否则只从子类调用'Run'方法

这就是我所拥有的,它似乎有效,但我想知道是否有一种更简单或更具蟒蛇式的方法

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
版本,以确保我做得正确:)