【问题标题】:Python derived class intricaciesPython派生类错综复杂
【发布时间】:2015-11-02 15:48:25
【问题描述】:

我有父类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打印“工厂类型”吗?

【问题讨论】:

  • 您能解释一下您的预期吗?为什么不是这样?
  • @jonrsharpe 我不明白为什么“print(which_factory)”分别返回“factory_foo”和“factory_bar”。
  • ...而不是 what,确切地说 - 你期待什么让你对此感到惊讶?
  • @jonrsharpe 我不知道分配给“self.which_factory”的“值”会导致“factory_foo”和“factory_bar”。
  • 你从你的类方法中明确传递给__init__的那些,也许?除了得到的结果之外,我真的不明白你为什么期望其他任何东西。

标签: python class python-3.x


【解决方案1】:

您自己在__init__ 的Yappy 中打印:

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

Xyzzy 类没有这样的print() 调用。

【讨论】:

    【解决方案2】:

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

    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>
    

    【讨论】:

    • 我真的被困住了。我现在明白了。
    • @anarchos78 请注意,您可以随时随地拨打print 电话,这通常对弄清楚流程非常有帮助。你也可以使用pythontutor.com/visualize.html#mode=edit
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 2017-08-06
    • 2011-01-16
    • 2016-08-31
    相关资源
    最近更新 更多