在python中,super()总是在方法中首先被调用。是否存在应该稍后调用的情况?
在调用super()之前是否需要进行一些处理 这是一个人为的例子。有更好的例子吗?这算是蟒蛇吗在python中,super()总是在方法中首先被调用。是否存在应该稍后调用的情况?,python,super,Python,Super,在调用super()之前是否需要进行一些处理 这是一个人为的例子。有更好的例子吗?这算是蟒蛇吗 class Base(object): def __init__(self, name): print "Base %s created" % name self._name = name class UpperBase(A): """ Similar to base but the name is in uppercase. """ def
class Base(object):
def __init__(self, name):
print "Base %s created" % name
self._name = name
class UpperBase(A):
""" Similar to base but the name is in uppercase. """
def __init__(self, name):
name = name.upper()
super(UpperBase, self).__init__(name)
有时,您需要在调用
super()
之前验证参数:
我不明白为什么这不是肾盂手术,因为这是最简单的方法,而且很简单。
此外,阅读JHaSundRes的注释,他做了一个很好的观点。 YA,Python中的init方法不是C++的构造函数,它不执行实际的内存分配。在调用init时,内存已分配。因此,它实际上只是一个具有特定语义的普通方法(在构造对象后调用)。总之,你应该可以在任何地方调用它。(如果我错了,请在C++中纠正我),构造函数不分配内存,而是初始化它,其他的事情也可以在那里完成。实际上,C++构造函数和Python的
Thread
子类时经常这样做-我通常有一些逻辑,根据构造函数参数为线程指定一个有意义的名称。我认为在调用super()…
方法之前,应该避免修改实例状态。因此,只需对参数进行一些计算(转换、验证等)就可以了,但不应更改实例的状态。@frans为什么?(我见过很多代码这样做)一方面,这是一种直觉,我无法完全解释。如果super()
方法总是在其他任何事情发生之前被调用,那么可能更容易理解发生了什么(没有任何例外,您必须解释)。如果您需要在安全调用基类的方法之前更改实例的状态,这也会让人觉得很奇怪(这将是从基类到派生类的语义依赖)
class UpperBase(Base):
def __init__(self, name):
if not name_valid(name):
raise ValueError()
super(UpperBase, self).__init__(name)