如何从外部访问内部 class __OnlyOne

how to access access inner class __OnlyOne from outer

我在从外部访问内部 class __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')

使用 _ 而不是 __。

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

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

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