【问题标题】:how to access access inner class __OnlyOne from outer如何从外部访问内部类 __OnlyOne
【发布时间】:2021-12-31 06:14:56
【问题描述】:

从外部访问内部类 __OnlyOne 时出现以下错误。这里有什么问题? 我试图在这里使用单例设计模式,只为外部创建一个内部对象实例。

  Traceback (most recent call last):
  File "F:\parking_lot_code\test.py", line 25, in <module>
    PL.add_parking_floor('First Floor')
  File "F:\parking_lot_code\test.py", line 21, in add_parking_floor
    ParkingLot.instance.__parking_floors.append(floor)
AttributeError: '__OnlyOne' object has no attribute '_ParkingLot__parking_floors'

Process finished with exit code 1

代码

    class ParkingLot:
    instance = None

    class __OnlyOne:
        def __init__(self, name, address):
            self.__name = name
            self.__address = address
            self.__parking_floors = []

    def __init__(self, name, address):
        if not ParkingLot.instance:
            ParkingLot.instance = ParkingLot.__OnlyOne(name, address)
        else:
            ParkingLot.instance.__name = name
            ParkingLot.instance.__address = address

    def __getattr__(self, name):
        return getattr(self.instance, name)

    def add_parking_floor(self, floor):
        ParkingLot.instance.__parking_floors.append(floor)


PL = ParkingLot('Test Parking Lot', 'Bombay')
PL.add_parking_floor('First Floor')

【问题讨论】:

    标签: python singleton inner-classes


    【解决方案1】:

    在 python 中,创建以双下划线开头的函数会将函数的名称更改为 _classname__methodname,如此处所述 - https://www.python.org/dev/peps/pep-0008/#descriptive-naming-styles

    所以尽量使用“真实姓名”甚至更好,不要使用双下划线作为“外部”使用。如果您确实想使用双下划线,请创建一个公开它的方法

    【讨论】:

    • 我是 python 中的 OOPS 的新手,你能指出这条线并让我知道应该修改什么版本作为示例。谢谢
    • 为什么我在使用 ParkingLot.instance.parking_floors.append(floor) 时遇到问题,但在 ParkingLot.instance.__name = name ParkingLot.instance.__address = address 中没有问题
    【解决方案2】:

    使用 _ 代替 __。

    或 使用@property https://docs.python.org/ko/3/howto/descriptor.html

    【讨论】:

      猜你喜欢
      • 2011-01-02
      • 2011-02-13
      • 2021-03-13
      • 1970-01-01
      • 2019-03-29
      • 1970-01-01
      • 2014-02-11
      • 2010-10-29
      相关资源
      最近更新 更多