我对python3中的类有疑问。在我的程序中,我有一个“主”类,该类首先开始,并设置一些其他部分所需的参数。但是现在我的其他班级需要主班级的一些对象。每当子类需要该对象时,如何在不初始化主类的情况下使用主类的对象?我研究了python继承,但也许我没有正确理解
class Chunk(main.Main):
def __init__(self,pos_in_world_x,pos_in_world_y):
#self.chunksize = settings.blocks_per_chunk
self.prog = main.Main.prog
self.ctx = main.Main.ctx
这是我的子类代码
答案 0 :(得分:1)
您可以使用类变量:
class Main():
prog = 1
ctx = 2
def __init__(self):
pass
class Chunk(Main):
def __init__(self, pos_in_world_x, pos_in_world_y):
self.prog = Main.prog
self.ctx = Main.ctx
a = Chunk(3, 4)
print(a.prog) # 1
print(a.ctx) # 2
如果您无法更改Main
将定义移到__init__
之外,那么您所要求的就是不可能的。如果您的变量是在__init__
中定义的,则在调用__init__
(即初始化类)之前无法访问它。你无法解决这个问题。
答案 1 :(得分:0)
您需要在子类中进行超级__init__
调用,如果需要,您只需要这样做:
class Chunk(main.Main):
def __init__(self,pos_in_world_x,pos_in_world_y):
super().__init__()
#self.chunksize = settings.blocks_per_chunk
这两项任务都是由Main的__init__
完成的。
但是我认为Chunk与Main并不是 is-a ,而是 has-a 关系,因此Main实际上应该是一个参数而不是超类:
class Chunk(object):
def __init__(self, main, pos_in_world_x,pos_in_world_y):
#self.chunksize = settings.blocks_per_chunk
self.prog = main.prog
self.ctx = main.ctx
任何创建块的人都必须通过Main实例。
答案 2 :(得分:0)
实际上很难在Python中隐藏信息,因此这里有一些不需要继承的选项(有关继承选项,请参见jpp的回答)。通常,当您显式传递信息(下面的选项1或继承)时,代码更容易理解,但是在某些情况下,您可能更希望使用其他选项。
选项1 :只需将所需的信息作为其他参数传递给Chunk
的{{1}}(可以通过传递__init__
和{{1 }}本身的值,或者通过传递prog
类或其实例-取决于所需的信息是存储为类变量还是实例变量)。这是将ctx
作为参数传递的示例:
Main
选项2 :Main
可以直接访问class Main():
prog = 1
ctx = 2
def __init__(self):
pass
class Chunk():
def __init__(self, pos_in_world_x, pos_in_world_y, M):
#self.chunksize = settings.blocks_per_chunk
self.prog = M.prog
self.ctx = M.ctx
c = Chunk(3, 4, Main)
print(c.prog) # 1
print(c.ctx) # 2
的类变量:
Chunk
选项3 :Main
可以直接访问class Main():
prog = 1
ctx = 2
def __init__(self):
pass
class Chunk():
def __init__(self, pos_in_world_x, pos_in_world_y):
#self.chunksize = settings.blocks_per_chunk
self.prog = Main.prog
self.ctx = Main.ctx
c = Chunk(3, 4)
print(c.prog) # 1
print(c.ctx) # 2
实例的实例变量(Chunk
需要在实例化Main
之前被实例化):
Main