Python派生类错综复杂

时间:2015-11-02 15:48:25

标签: python class python-3.x

我有父类Xyzzy和衍生类[衍生自Xyzzy] Yappy,如下所示:

class Xyzzy(object):
    def __init__(self, which_factory):
        self.which_factory = which_factory

    @classmethod
    def factory_foo(cls):
        return cls('factory_foo')

    @classmethod
    def factory_bar(cls):
        return cls('factory_bar')


class Yappy(Xyzzy):
    def __init__(self, which_factory):
        super(Yappy, self).__init__(which_factory)
        print(which_factory)

当我打印它们时,只有Yappy类打印出工厂类型而不是Xyzzy

print(Xyzzy.factory_foo())
print(Xyzzy.factory_bar())
print('/-----------/')
print(Yappy.factory_foo())
print(Yappy.factory_bar())

我得到了:

>>> Xyzzy.factory_foo()
<__main__.Xyzzy object at 0x0482F430>
>>> Xyzzy.factory_bar()
<__main__.Xyzzy object at 0x0482F430>
>>> Yappy.factory_foo()
factory_foo
<__main__.Yappy object at 0x0482F3D0>
>>> Yappy.factory_bar()
factory_bar
<__main__.Yappy object at 0x0482F3D0>

有人可以解释为什么“工厂类型”由派生类Yappy打印而不是由父类Xyzzy打印?

2 个答案:

答案 0 :(得分:5)

您可以在__init__的{​​{1}}中自行打印:

Yappy

class Yappy(Xyzzy): def __init__(self, which_factory): super(Yappy, self).__init__(which_factory) print(which_factory) 班级没有此类Xyzzy来电。

答案 1 :(得分:1)

我仍然不完全清楚让您感到困惑的是什么,但也许在代码中看到更具体的路径会有所帮助:

class Xyzzy(object):

    def __init__(self, which_factory):
        print('calling Xyzzy.__init__')
        self.which_factory = which_factory

    @classmethod
    def factory_foo(cls):
        print('calling factory_foo with', cls)
        return cls('factory_foo')

    @classmethod
    def factory_bar(cls):
        print('calling factory_bar with', cls)
        return cls('factory_bar')


class Yappy(Xyzzy):

    def __init__(self, which_factory):
        print('calling Yappy.__init__')
        super(Yappy, self).__init__(which_factory)
        print(which_factory)

使用中:

>>> Xyzzy('some var')
calling Xyzzy.__init__
<__main__.Xyzzy object at 0x02B8DCD0>

>>> Xyzzy.factory_foo()
calling factory_foo with <class '__main__.Xyzzy'>
calling Xyzzy.__init__
<__main__.Xyzzy object at 0x02A4BE70>

>>> Xyzzy('some var').factory_foo()
calling Xyzzy.__init__
calling factory_foo with <class '__main__.Xyzzy'>
calling Xyzzy.__init__
<__main__.Xyzzy object at 0x02A55C50>


>>> Yappy('some var')
calling Yappy.__init__
calling Xyzzy.__init__
some var
<__main__.Yappy object at 0x02B8DD10>

>>> Yappy.factory_foo()
calling factory_foo with <class '__main__.Yappy'>
calling Yappy.__init__
calling Xyzzy.__init__
factory_foo
<__main__.Yappy object at 0x02A55C50>

>>> Yappy('some var').factory_foo()
calling Yappy.__init__
calling Xyzzy.__init__
some var
calling factory_foo with <class '__main__.Yappy'>
calling Yappy.__init__
calling Xyzzy.__init__
factory_foo
<__main__.Yappy object at 0x02A4BE70>