【问题标题】:What does it mean for a private method to be only accessible from its own class in python?私有方法只能从 python 中自己的类访问是什么意思?
【发布时间】:2013-06-15 12:42:21
【问题描述】:

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

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

我可以说:

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

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

我猜“课外”是一个我不理解的术语,b/c a turboCar 对我来说不是课外Car

【问题讨论】:

  • 在命令行使用 python 解释器 (IDLE)
  • 非常感谢您的帮助
  • Car turboCar = Car(); 肯定行不通。只需turboCar = Car(),请省略这些丑陋的;

标签: python static private


【解决方案1】:

调用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 中没有像 C++ 之类的真正私有变量,

>>> turboCar._Car__odometer = 9999
>>> turboCar.read_odometer()
9999
>>> turboCar._Car__reset_odometer()
>>> turboCar.read_odometer()
0

【讨论】:

  • 好的,非常感谢! ...“即使在 Car 对象上调用该方法,它仍然在类 DEFINITION 之外。”谢谢,这很有帮助。实际上,您的所有答案都非常有帮助。谢谢,我现在明白了。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:
    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.
    

    【讨论】:

    • 好的,所以你是说即使turbocar是Car的一个实例,turbocar不能使用Car方法?我想我认为 Car 类及其实例(在本例中为涡轮汽车)可以访问相同的方法和属性。
    • 感谢您的帮助!出于某种原因,出于访问权限的目的,类及其实例是相同的。但是现在我看到私有方法通常是小sn-ps,在内部用于支持更大的方法
    猜你喜欢
    • 1970-01-01
    • 2015-08-01
    • 2011-04-29
    • 2016-02-14
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 2013-07-28
    • 2013-04-10
    相关资源
    最近更新 更多