2012-07-22 129 views
-1

我一直在寻找答案,但没有运气。我需要有一个子类访问其父类中属性的值。如何从Python中的私有类继承父类属性?

下面是一个例子:

class myclass: 
    def __init__(self): 

     class __firstinternal__: 
      def __init__(self): 
       self.second = __secondinternal__() 

     class __secondinternal__: 
      def __init__(self): 
       self.var = myclass.getString() 

    def getString(self): 
     return "something" 

    self.internal = __firstinternal__() 
    print self.internal.second.var 

c = myclass() 
Traceback (most recent call last): 
    File "./inheritest.py", line 19, in <module> 
    c = myclass() 
    File "./inheritest.py", line 15, in __init__ 
    self.internal = __firstinternal__() 
    File "./inheritest.py", line 7, in __init__ 
    self.second = __secondinternal__() 
    File "./inheritest.py", line 11, in __init__ 
    self.anothervar = myclass.getString() 
AttributeError: class myclass has no attribute 'getString' 

换句话说,我需要secondinternal继承方法的getString()从父MyClass的。

我发现如何做到这一点,当类不是一个孩子,但我想保持这两个类是私人的。

任何想法?

在此先感谢!

+3

您的代码没有意义。在'__init__'方法中定义这些类将不会执行任何操作;当方法结束执行时,它们会消失。你有可能在你的代码中搞砸缩进吗?你是否试图将类设置为外部类的属性?另外,你为什么使用双下划线? – BrenBarn 2012-07-22 19:27:52

+1

XY。描述你试图解决的问题,而不是想象中的愚蠢解决方案。 – 2012-07-22 19:30:21

+0

只要子类使用自己的方法,代码就可以完美地工作。我的问题是只有当我需要使用父类的方法。关于双下划线 - 嗯,我认为这是一个孩子班级应该如何定义的... – user1544357 2012-07-22 19:32:20

回答

2

目前尚不清楚“孩子班”和“家长班”的含义。在另一个类中定义一个类并不是一种常见的Python模式。你需要更多地解释你如何使用这些术语。此外,您发布的代码不会给出您描述的错误,所以看起来您发布的代码不同于您正在运行的代码。

根据你的代码,我可以给出的最佳答案是“你不能做你想做的事情。”如果在的__init__方法中定义了__firstinternal__,则它没有提及myclass,所以它无法访问它或其任何方法。 myclass只有在定义了所有方法后才存在,因此方法内部没有任何东西可以在类定义时访问类定义的其他部分。你可以在运行时通过myclass.getString()来访问它,你认为它不起作用,但如前所述,这是没有意义的,因为你给出的错误不是代码实际做的。

这可能是你应该使用继承而不是相互定义类,但这只是一个疯狂的猜测。

您应该阅读Python tutorial以了解如何在Python中使用类。

+0

感谢大家的及时回复。 – user1544357 2012-07-22 19:40:10

1

您的代码很混乱。尽我所知,这里有两种不同的方式来做类似你想要的事情。

class myclass: 
    def __init__(self): 
     pass 

    def getString(self): 
     return "something" 

class child(myclass): 
    def __init__(self): 
     self.var = self.getString() 

    def someMethod(self): 
     return "hello" 

...它的输出:

>>> c = child() 
>>> print c.var 
something 

在这里,我定义了一个父类myclasschild继承myclass。它可以像正常一样调用getString,因为它继承了它。

如果你需要保持你的类私人(这是不是在Python中常见的成语),这里是做到这一点的一种方法:

class myclass2: 
    def __init__(self): 
     class temp(myclass2): # inherits myclass 
      def __init__(self): 
       self.var = self.getString() 

     self.__privateClass = temp 

    def getString(self): 
     return "something else" 

    def test(self): 
     temp = self.__privateClass() 
     print temp.var 

和输出:

>>> m = myclass2() 
>>> m.test() 

。尽管这种方法有点愚蠢。

另请注意,双下划线用于将某些内容标记为私有,而不是孩子类。(另请注意,“私有变量”的概念在python中与其他语言不同。)More info