Python:访问其他类对象

时间:2018-12-25 10:45:50

标签: python class

我对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

这是我的子类代码

3 个答案:

答案 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