如何覆盖子类中的类变量?



我正在研究用英语打印不同消息的类。我想创建另一个具有完全相同功能但具有不同语言的消息的类。

当我最近了解子类时,我想进行一些练习并重写我的 Class(( 方法以将所有消息保存在变量中,我试图在 NewClass(Class( 中覆盖这些变量。这是我代码的快捷方式:

class Class:
def __init__(self, some_other_arguments):
self.msg_1 = 'message 1'
if some_condition:
raise KeyError(self.msg_1)
class NewClass(Class):
def __init__(self, some_other_arguments):
super().__init__(some_other_arguments)
self.msg_1 = 'message 2'
object_1 = Class(some_arguments) #should print 'message 1'
#prints 'message 1'
object_2 = NewClass(some_argiments) #should print 'message 2'
#prints 'message 1'

起初我想复制头等舱,重命名它并更改消息。但这会产生我想避免的冗余代码。我做错了什么?

class Class:
def __init__(self):
self.msg_1 = 'message 1'
print(self.msg_1)
class NewClass(Class):
def __init__(self):
super().__init__()
self.msg_1 = 'message 2'
object_1 = Class() #prints 'message 1'
object_2 = NewClass() #prints 'message 1'

您的代码似乎按预期工作:

class Class:
def __init__(self):
self.msg_1 = 'message 1'
class NewClass(Class):
def __init__(self):
super().__init__()
self.msg_1 = 'message 2'
object_1 = Class()
object_2 = NewClass()

object_1.msg_1 打印message 1

object_2.msg_1 打印message 2

编辑

class Class:
def __init__(self):
self.msg_1 = 'message 1'
print(self.msg_1)
class NewClass(Class):
def __init__(self):
super().__init__()
self.msg_1 = 'message 2'
print(self.msg_1)

上面的代码将打印出来:

message 1
message 1
message 2

因此,也许您可以将消息添加到 init 调用中:

class Class:
def __init__(self, message):
self.msg_1 = message
print(self.msg_1)
class NewClass(Class):
def __init__(self, message):
super().__init__(message)
Class('Hi')
NewClass('Bonjour')

我用super(ChildClass, self).__init__()来调用ParentClass的构造函数。虽然,super()的文档表明super().__init()是等价的。 参考

从技术上讲,您也在做同样的事情。所以,应该没问题。

class A(object):
def __init__(self):
print("world")
self.var = 'message 1'
class B(A):
def __init__(self):
print("hello")
super(B, self).__init__()
print('Before Changing: {}'.format(self.var))
self.var = 'message 2'
print('After Changing: {}'.format(self.var))
b = B()

输出

hello
world
Before Changing: message 1
After Changing: message 2

您的代码

您两次都打印出"消息 1",因为它只是从内部打印Class。但是,如果您在将msg_1更改为"消息 2"后包含另一个打印语句,这将解决您的问题。我添加了一些打印语句来帮助跟踪何时调用超级以及之后会发生什么。

class Class:
def __init__(self):
print("Class")
self.msg_1 = 'message 1'
print(self.msg_1)
class NewClass(Class):
def __init__(self):
print("NewClass")
super(NewClass, self).__init__()
self.msg_1 = 'message 2'
print("======")
print(self.msg_1)  ### YOU NEEDED A PRINT STATEMENT HERE
object_1 = Class() #prints 'message 1'
print("==================")
object_2 = NewClass() #prints 'message 1' and then 'message 2'

输出

Class
message 1
==================
NewClass
Class
message 1
======
message 2

我希望这有所帮助。

最新更新