在python中,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

在调用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 __init__(self, name):
        name = name.upper() 
        super(UpperBase, self).__init__(name)

有时,您需要在调用
super()
之前验证参数:

我不明白为什么这不是肾盂手术,因为这是最简单的方法,而且很简单。
此外,阅读JHaSundRes的注释,他做了一个很好的观点。

YA,Python中的init方法不是C++的构造函数,它不执行实际的内存分配。在调用init时,内存已分配。因此,它实际上只是一个具有特定语义的普通方法(在构造对象后调用)。总之,你应该可以在任何地方调用它。(如果我错了,请在C++中纠正我),构造函数不分配内存,而是初始化它,其他的事情也可以在那里完成。实际上,C++构造函数和Python的(Syth-InITSuy)()/Cux>方法之间存在很大的差异,但这个问题是关于 Suffer()/>代码>,而不是<代码> Suffer()。:您的示例正是在向上调用父类之前执行额外计算的情况。我知道我在定义
Thread
子类时经常这样做-我通常有一些逻辑,根据构造函数参数为线程指定一个有意义的名称。我认为在调用
super()…
方法之前,应该避免修改实例状态。因此,只需对参数进行一些计算(转换、验证等)就可以了,但不应更改实例的状态。@frans为什么?(我见过很多代码这样做)一方面,这是一种直觉,我无法完全解释。如果
super()
方法总是在其他任何事情发生之前被调用,那么可能更容易理解发生了什么(没有任何例外,您必须解释)。如果您需要在安全调用基类的方法之前更改实例的状态,这也会让人觉得很奇怪(这将是从基类到派生类的语义依赖)
class UpperBase(Base):
    def __init__(self, name):
        if not name_valid(name):
            raise ValueError()
        super(UpperBase, self).__init__(name)