如何从python中的私有类继承父类属性?

时间:2012-07-22 19:24:11

标签: python class inheritance parent-child

我一直在寻找答案,但还没有运气。我需要让子类访问其父类中的属性值。

以下是一个例子:

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'

换句话说,我需要 secondneternal 从父myclass继承方法getString()。

我发现当班级不是孩子时如何做到这一点,但我想把这两个班别保密。

有什么想法吗?

提前致谢!

2 个答案:

答案 0 :(得分:2)

不清楚你的意思是什么?&#34;儿童班&#34;和#34;父母班&#34;。在另一个类中定义一个类不是通常的Python模式。您需要详细说明您如何使用这些条款。此外,您发布的代码并未显示您所描述的错误,因此您似乎发布的代码与您正在运行的代码不同。

我可以根据您的代码给出的最佳答案是,&#34;您不能做您正在尝试做的事情。&#34;如果您在__firstinternal__的{​​{1}}方法中定义__init__,则它不会引用myclass,因此无法访问它或其任何方法。 myclass直到定义了所有方法之后才存在,因此方法内部的任何内容都不能在类定义时访问类定义的其他部分。您可以通过myclass在运行时访问它,您说它不起作用,但如上所述,这是没有意义的,因为您提供的错误不是代码实际执行的操作。

可能你应该使用继承而不是在彼此内部定义类,但这只是一个疯狂的猜测。

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

答案 1 :(得分: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

在这里,我定义了一个父类myclass,并使child继承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