我有父类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
打印?
答案 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>