首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么当类没有指定超类时使用.__init__(*args,**kwargs)?

为什么当类没有指定超类时使用.__init__(*args,**kwargs)?
EN

Stack Overflow用户
提问于 2018-05-20 16:14:17
回答 1查看 5.4K关注 0票数 10

我理解为什么当类是超类的子类时使用super(),但是没有在子类参数中指定超类的类的超类是什么?这是我的密码:

代码语言:javascript
复制
import random


class Sneaky:
    sneaky = True

    def __init__(self, sneaky=True, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.sneaky = sneaky

    def hide(self, light_level):
        return self.sneaky and light_level < 10


class Agile:
    agile = True

    def __init__(self, agile=True, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.agile = agile

    def evade(self):
        return self.agile and random.randint(0, 1)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-20 16:28:58

假设Sneaky被用作多继承类结构的一部分,如:

代码语言:javascript
复制
class Sneaky:
    sneaky = True

    def __init__(self, sneaky=True, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.sneaky = sneaky

    def hide(self, light_level):
        return self.sneaky and light_level < 10

class Person:
    def __init__(self, human=True, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.human = human

class Thief(Sneaky, Person): 
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)


t = Thief()
print(t.human)
# True

因为

代码语言:javascript
复制
In [62]: Thief.mro()
Out[62]: [__main__.Thief, __main__.Sneaky, __main__.Person, object]
  • Thief.__init__super().__init__(*args, **kwargs)Sneaky.__init__打电话。
  • Sneaky.__init__super().__init__(*args, **kwargs)Person.__init__打电话。

如果将super().__init__调用从Sneaky.__init__中删除,则t.human将引发

代码语言:javascript
复制
AttributeError: 'Thief' object has no attribute 'human'

因为Person.__init__不会被调用。

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50436857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档