我一直在寻找答案,但还没有运气。我需要让子类访问其父类中的属性值。
以下是一个例子:
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()。
我发现当班级不是孩子时如何做到这一点,但我想把这两个班别保密。
有什么想法吗?
提前致谢!
答案 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)