打印从其他类继承的另一个类的参数

2024-09-30 20:28:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

a类:包含自我王从类b继承的(由用户输入)

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

类c:从类a继承,该类具有从类b输入的king值,然后传递给类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,那么类c使用super。init()将继承它的值并相应地打印它。我是不是做错了,对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

Tags: 用户nameselfifobjectinitmaindef
3条回答

你在向后看。定义class b(a):意味着ba继承,而不是相反,所以当调用c__init__上的super时,您调用的是a。你知道吗

基本上,当您执行c()(与c.__init__()相同)时,c__init__函数的第一行变为a.__init__()(与a()相同),并且正如错误所说的a__init__函数使用king参数,如果没有这样的参数就不能调用。你知道吗

此外,类和对象之间存在概念上的误解,例如在代码中,abc是类(更不用说类应该总是以大写字母开头),而bbcc是对象。一旦定义了类,就不能继承在类定义之外修改的属性。你知道吗

编辑:

在阅读了几篇评论之后,我认为您想要的是一个静态属性king,重要的是要知道self关键字只存在于对象中,因此通过执行self.king = king,您的意思是只有a的对象将具有king属性,而不是a类本身。你知道吗

假设我们有一个类A

class A(object): 
     p1 = 'static'
     def __init__(self): 
         self.p2 = 'object'

我可以访问A.p1A().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的对象具有新参数,例如:

class C(A): 
     def __init__(self): 
         super(C, self).__init__() 
         print(self.p1)

你可以做:

print(A().p1)
B('modified')
C()

即使第一行打印'static',最后一行也会打印'modified'。你知道吗

这将是最类似于我目前解决的问题,我想得到什么。 我的目标实际上是找到一种方法来传递这个存储值,它在类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()

我认为这个例子符合你的要求。唯一需要构造函数(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)

相关问题 更多 >