在超类构造函数或子类构造函数中调用方法?
1. 将配置传递给 __init__
方法,这个方法会隐式地调用 register
:
class Base:
def __init__(self, *verbs):
if not verbs:
verbs = "get", "post"
self._register(verbs)
def _register(self, *verbs):
pass
class Sub(Base):
def __init__(self):
super().__init__("get", "post", "put")
2. 在子类的 __init__
方法中显式地调用 register
:
class Base:
def __init__(self):
self._register("get", "post")
def _register(self, *verbs):
pass
class Sub(Base):
def __init__(self):
self._register("get", "post", "put")
我使用的是 Python 3。
哪种方式更好或者更符合 Python 的风格?还是说这只是个人喜好问题?
4 个回答
0
在我看来,第二种方法更好。更“Pythonic”的做法是尽量让事情变得明确。这样你就不需要去查找父类的构造函数,看看它是怎么处理那些参数的……
0
如果所有从基类(也就是父类)扩展出来的东西都表现得一样,我个人会在基类的构造函数里调用。如果不是,行为各不相同的话,我就会在子类(也就是从基类派生出来的类)里调用...
至于什么更符合Python的风格——别盲目追随某种潮流,写出能正常工作的代码就行...
马丁
3
我觉得这些选项都不是很好。最接近的解决方案可能是:
class Base(object):
def __init__(self):
self._register("get", "post")
class Sub(Base):
def __init__(self):
super(Sub, self).__init__()
self._register("put")
我也在想,是否把动词在类的层面上注册会更好。因为它们对于所有实例来说可能是一样的,那为什么要为每个实例单独注册呢?