显然,我有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
答案 0 :(得分:0)
您正在向后看。定义class b(a):
时,意味着b
继承自a
,而不是相反,因此,当您在super
的{{1 }}您正在呼叫c
。
基本上,当您执行__init__
(与a
相同)时,c()
的{{1}}函数的第一行变为c.__init__()
(与c
相同),并且错误提示__init__
的{{1}}函数采用a.__init__()
参数,没有这样的参数就无法调用。
此外,在类和对象之间存在概念上的误解,例如在您的代码a()
,a
和__init__
中类(更不用说类应该始终以大写字母开头),而king
和a
是对象。定义类后,将不会继承类定义之外修改的属性。
编辑:
在阅读了几条评论之后,我认为您想要的是静态属性之王,了解b
关键字仅存在于对象中非常重要,因此通过执行c
您是说只有bb
个对象具有cc
属性,而没有self
类本身。
假设我们有一个self.king = king
类:
a
我可以访问king
或a
并获得A
,class 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()