【问题标题】:Python - Accessing parent membersPython - 访问父成员
【发布时间】:2011-12-13 21:40:03
【问题描述】:

当成员类是外部模块的一部分时,我在试图弄清楚如何让成员类从其父类访问数据时遇到了停顿。

基本上,这是可行的(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")

但是,如果类开始变得特别大,这可能会变得非常混乱,因此我一直将我的其他类放在文件中并内联导入它们。问题是如果我在定义类 B 时尝试使用“import B.py”,我将无法再让成员类访问其父类的成员和函数。

有没有办法在不将成员类与父类放在同一个文件中的情况下获得原始行为?

【问题讨论】:

  • 你用的是什么python版本?在 2.7 中它不起作用,因为您将 A(类)传递给预期 A 实例的位置
  • 你的缩进是否正确?它似乎不是。 “B 类可以访问的是父类的方法,如下所示:A.say_hi(A)”根本没有任何意义。因为A.say_hi(A) 是非常非常奇特的Python。你对继承感到困惑吗?这是你的问题吗?
  • @soulcheck 它在 py3k 中工作,(缩进如帖子中所示)

标签: python class import namespaces member


【解决方案1】:

实际上,在您的示例中,您无法在 B 类中访问 A 的实例。代码 A.say_hi(A) 确实有效,但是错误。你的问题在 cmets 中已经说过了。

如果您希望能够访问父实例,请执行以下操作:

模块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!'

【讨论】:

  • 他可以在他的代码中从“B”访问“A”,由于副作用:当 B 中的函数最终被调用时,类 A 将在模块全局命名空间中可用,从“A”的一个实例。
  • 可以访问类A,但不能访问A的实例,这是重要的区别。如果不是循环导入,那么在模块 b 中访问类 A 也很容易,只需导入 a 就可以了。
【解决方案2】:

如果将对象(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()

【讨论】:

    猜你喜欢
    • 2015-08-06
    • 1970-01-01
    • 2018-12-31
    • 2018-09-24
    • 2011-11-03
    • 2013-05-23
    • 2013-07-15
    • 2018-07-22
    • 2013-11-14
    相关资源
    最近更新 更多