打印另一个类的参数,该另一个类继承自另一个类

时间:2018-12-03 03:52:36

标签: python super

显然,我有3个不同的班级; a,b和c。

a类:包含从b类(由用户输入)继承的self.king

b类:提示用户输入王者值,这将传递给a类

c类:从a类继承,该类具有从b类输入的国王值,然后将其传递给a类。

代码示例:

class a(object):
    def __init__(self, king):
        self.king = king

class b(a):
    def __init__(self, king):
        super(b,self).__init__(king=king)

class c(a):
    def __init__(self):
        super(c,self).__init__()
        print(self.king)

if __name__ == "__main__":
    bb = b(king="madsfjsfdsdfn")
    cc = c()
    cc

我在这里做错了吗?我收到诸如以下错误:

TypeError: __init__() missing 1 required positional argument: 'king'

我认为在b类中输入的值已传递给a类。由于已将其传递给类a,因此使用super。 init ()将继承类c,并据此进行打印。我做错了吗并且错误理解了super()函数?

当用户通过值且仅存在2类时:

class a(object):
    def __init__(self, king):
        self.king = king

class b(a):
    def __init__(self, king):
        super(b,self).__init__(king=king)
        print(self.king)

if __name__ == "__main__":
    bb = b(king="madsfjsfdsdfn")
    bb

然后我的输出是正确的:

madsfjsfdsdfn

3 个答案:

答案 0 :(得分:0)

您正在向后看。定义class b(a):时,意味着b继承自a,而不是相反,因此,当您在super的{​​{1 }}您正在呼叫c

基本上,当您执行__init__(与a相同)时,c()的{​​{1}}函数的第一行变为c.__init__()(与c相同),并且错误提示__init__的{​​{1}}函数采用a.__init__()参数,没有这样的参数就无法调用。

此外,在对象之间存在概念上的误解,例如在您的代码a()a__init__中类(更不用说类应该始终以大写字母开头),而kinga是对象。定义类后,将不会继承类定义之外修改的属性。

编辑

在阅读了几条评论之后,我认为您想要的是静态属性之王,了解b关键字仅存在于对象中非常重要,因此通过执行c您是说只有bb个对象具有cc属性,而没有self类本身。

假设我们有一个self.king = king类:

a

我可以访问kinga并获得Aclass A(object): p1 = 'static' def __init__(self): self.p2 = 'object' 会给我A.p1,而A().p1会给我一个错误,因为'static'不是对象。如果某个类是从A().p2继承而来的,那么它只会继承'object' ,因为A.p2不是静态的。

我了解您想要做的是更改该A,使其实例化一个继承自A的类,例如说p1

p2

p1实际上不是父类,而是一个返回对象的内置函数,因此产生以下结果:

A

您必须要做的

B

明确地修改class B(A): def __init__(self, param): super(B, self).__init__() super.p1 = param 类,以便从那里,继承自super的类的对象将具有新的参数,可以这样说:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-12-ca4dc9978d74> in <module>
----> 1 B(2)

<ipython-input-10-af935ee24ae2> in __init__(self, param)
      2     def __init__(self, param):
      3         super(B, self).__init__()
----> 4         super.p1 = param
      5 
      6 

TypeError: can't set attributes of built-in/extension type 'super'

您可以这样做:

class B(A): 
     def __init__(self, param): 
         super(B, self).__init__() 
         A.p1 = param

看到即使第一行将打印A,最后一行也将打印A

答案 1 :(得分:0)

我认为此示例符合您的规范。唯一需要构造函数的类( init )是在类的实例中存储值(创建一个对象以存储国王值)的类。

        #Child classes inherit from parent classes 
        class b():
            def prompt_for_king():
                return input("Enter king value!\n")

        class a(b):
            def __init__(self):
                self.king = b.prompt_for_king()

        class c(a):
            pass

        if __name__ == "__main__":
            #instantiate class
            object_c=c()
            print (object_c.king)

答案 2 :(得分:0)

这将与我当前解决的问题以及我想要得到的最相似。 我的目标实际上是找到一种方法来传递此存储的值,该存储值在类b中调用(从我的示例中)并作为类a的实例传递,然后将其继承给类c 代码:

class a(object):
    def __init__(self, king):
        self.yes = king 

    def passing(self):
        return self.yes

class c(object):
    def __init__(self, king):
        self.yes = king

    def ps(self):
        print(self.yes)

class b(a,c):
    def __init__(self, king):
        super().__init__(king = king)


if __name__ == "__main__":
    bb = b(king="aaa")
    bb.ps()