从父方法调用子属性

时间:2017-10-26 19:52:57

标签: python-3.x inheritance methods attributes parent

不能在父方法中调用子属性,这里是测试:

#!/usr/bin/env python3

class A():
    def getPath(self):
        return self.__path

class B(A):

    def __init__( self, name, path):
        self.__name = name
        self.__path = path

instance = B('test', '/home/test/Projects')

print(instance.getPath())

运行python测试文件$ ./test.py返回

./test.py 
Traceback (most recent call last):
  File "./test.py", line 17, in <module>
    print(instance.getPath())
  File "./test.py", line 6, in getPath
    return self.__path
AttributeError: 'B' object has no attribute '_A__path'

2 个答案:

答案 0 :(得分:1)

除非您知道自己需要它,否则请勿使用__path_path足以将其标记为“私有”。但是,A.getPath不应该尝试返回A本身未定义的任何内容。而是从A.__init__调用B.__init__以确保正确完成任何A特定初始化:

class A:
    def __init__(self, path):
        self._path = path

    def get_path(self):
        return self._path

class B(A):

    def __init__(self, name, path):
        super().__init__(path)
        self._name = name

instance = B('test', '/home/test/Projects')

print(instance.get_path())

现在_path已正确隔离到A,您可以切换回__path,例如,如果您担心子类添加它自己的_path属性。

class A:
    def __init__(self, path):
        self.__path = path

    def get_path(self):
        return self.__path

class B(A):
    def __init__(self, name, path):
        super().__init__(path)
        self._name = name
        self._path = "foo"

 instance = B('test', '/home/test/Projects')

 print("{}, not {}".format(instance.get_path(), instance._path))

答案 1 :(得分:1)

您正在使用私有属性。如果使用非私有属性执行此操作,则会成功。

Python中的私有属性旨在允许每个类拥有自己的变量私有副本,而不会被子类覆盖该变量。所以在B中,__ path表示_B__path,而在A中,__ path表示__A_path。这正是Python的工作方式。 https://docs.python.org/3/tutorial/classes.html#tut-private

由于希望A能够访问__path,因此不应使用双下划线。相反,您可以使用单个下划线,这是一个约定,表示变量是私有的,而不实际执行它。

#!/usr/bin/env python3

class A():
    def getPath(self):
        return self._path

class B(A):

    def __init__( self, name, path):
        self.__name = name
        self._path = path

instance = B('test', '/home/test/Projects')

print(instance.getPath())

$ ./test.py
/home/test/Projects