【问题标题】:Only calling base class if its not subclassed in Python只有在 Python 中没有子类化时才调用基类
【发布时间】:2011-06-14 22:47:56
【问题描述】:

我需要编写一个基类(在本例中为 A 类),它可能(但不总是)被子类化。我只想在基类没有子类的情况下调用“运行”方法,否则只从子类调用“运行”方法。

这就是我所拥有的,它似乎可以工作,但我想知道是否有更简单或更 Pythonic 的方式。

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]

【问题讨论】:

    标签: python oop methods subclass


    【解决方案1】:

    您所看到的看起来是正确的,除了大多数程序员会查看 B.Run 方法并认为:“哦,他忘了调用 super。让我添加...”但我相信您会解释你在实际实现中所做的事情:)

    如果您担心在 C++ 中进行切片之类的事情,请放心。你有什么是好的。

    至于让它“更容易”,我不知道除了删除 A 的空 __init__ 函数和从 B 的 __init__ 中删除 pass 之外,你还能如何简化它。

    【讨论】:

    • 在实际实现中__init__() 方法中可能会有实际代码。我刚刚包含了pass 版本,以确保我做得正确:)
    【解决方案2】:

    我只想在基类没有子类的情况下调用“Run”方法,否则只从子类调用“Run”方法。

    这是默认情况下发生的,最具体的方法被调用。

    如果你真的不希望子类可以使用基本方法,你可以这样写:

    class C(object):
        def Run(self):
            if self.__class__ != C:
                raise NotImplementedError("You need to override this method")
    

    【讨论】:

    • 如果我导入基类,然后导入任何可能子类的类;我仍然需要调用基类 (A.Run()) 方法,如果我导入的其他任何内容都不是从它派生的,并且在我导入所有内容之前我不会知道是否有任何子类。
    猜你喜欢
    • 1970-01-01
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 2012-05-11
    • 2019-11-30
    相关资源
    最近更新 更多