-1

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

这是一个例子:

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从父 myclass 继承方法 getString()。

当班级不是孩子时,我已经找到了如何做到这一点,但我想将这两个班级保密。

有任何想法吗?

提前致谢!

4

2 回答 2

2

目前尚不清楚“子类”和“父类”是什么意思。在另一个类中定义一个类不是通常的 Python 模式。您需要详细说明您如何使用这些术语。此外,您发布的代码没有给出您描述的错误,因此您发布的代码似乎与您正在运行的代码不同。

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

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

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

于 2012-07-22T19:38:17.757 回答
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 中与其他语言不同。 更多信息

于 2012-07-22T20:04:21.493 回答