2

我读到私有类方法不能从他们的类之外调用。

如果我有一个Car带有私有方法的类__reset_odometer()

我能说......么:

import Car
Car turboCar = Car();
turboCar.__reset_odometer();

__reset_odometer()在 Car 类中定义。 turboCarCar类的一个实例。那么为什么调用该方法会 turboCar.__reset_odometer()导致访问错误呢?

我想“课外”是一个我不理解的术语,b/caturboCar对我来说不是课外Car

4

3 回答 3

3

调用turboCar.__reset_odometer()将引发异常,因为即使在Car对象上调用该方法,它仍然在类定义之外。可以这样想:您不在类中,在实例化时编写方法定义turboCar = Car()

所以你仍然可以__reset_odometer像这样在类内部引用,

class Car(object):
    def __init__(self):
        self.__odometer = 88800
        self.__reset_odometer()  # <-- call double underscore function

    def __reset_odometer(self):
        self.__odometer = 0

    def read_odometer(self):
        return self.__odometer

使用turboCar工作正常,里程表已重置,

>>> turboCar = Car()
>>> turboCar.read_odometer()
0

当然,在 Python 中没有像 inC++之类的真正私有变量,

>>> turboCar._Car__odometer = 9999
>>> turboCar.read_odometer()
9999
>>> turboCar._Car__reset_odometer()
>>> turboCar.read_odometer()
0
于 2013-06-19T05:48:23.037 回答
2
class Car(object):
    def __reset_odometer(self):
        pass
    def reset(self):
        self.__reset_odometer() # This is valid.

turbocar = Car()
turbocar.reset()
turbocar.__reset_odometer() # This is invalid. __reset_odometer is only accessible from Car methods.
于 2013-06-19T05:32:47.977 回答
1

您不应该使用 __ 将方法标记为私有。您应该只使用它来保护方法不被覆盖。将方法标记为私人使用_

在您的示例中,方法名称实际上是turboCar._ Car _reset_odometer因为这就是 Python 隐藏以 __ 开头的方法的方式。

您可以在此处找到有关 _ 和 __ 之间差异的更多信息

于 2013-06-19T05:35:19.673 回答