Python - 访问父类成员

2 投票
2 回答
2017 浏览
提问于 2025-04-17 08:20

我现在遇到了一些问题,想弄明白怎么让子类在外部模块中访问父类的数据。

基本上,这样是可以的(B类可以像这样访问它父类的方法:A.say_hi(A)):

class A:
    def __init__(self):
        print("Initializing parent object...")
        self.child = self.B()

    class B:
        def __init__(self):
            print("Initializing child...")
            A.say_hi(A)

    def say_hi(self):
        print("A class says hi")

不过,如果类变得很大,这样就会变得很麻烦,所以我把额外的类放在不同的文件里,并且在需要的时候导入它们。这样做的问题是,如果我尝试用'import B.py'来导入定义在外部的B类,子类就无法访问父类的成员和方法了。

有没有什么办法可以在不把子类放在和父类同一个文件里的情况下,恢复原来的访问方式呢?

2 个回答

0

如果你把对象(a)传给类(b),那么你可以直接调用它。

class a():
    def __init__(self):
        print"Made A"

    def test(self):
        print ">>A Test"

class b():
    def __init__(self,parent):
        print"Made B"
        self.parent = parent        
    def test(self):
        print ">>B Test"
        self.parent.test()

a = a()
a.test()
b = b(a)        
b.test()
3

其实在你的例子中,你无法在类 B 中访问类 A 的实例。而代码 A.say_hi(A) 是可以运行的,但实际上是错误的。这个问题在你提问的评论中也有人提到过。

如果你想要能够访问父类的实例,可以这样做:

模块 b

class B(object):
    def __init__(self, parent):
        self.parent = parent

    def say_hi(self):
        print 'Child says hi to his parent %s' % (
            self.parent.__class__.__name__
        )
        self.parent.say_hi()

模块 a

from b import B

class A(object):
    def __init__(self):
        self.b = B(self)

    def say_hi(self):
        print 'Parent says hi!'

撰写回答