如何从外部访问内部 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')
使用 _ 而不是 __。
在 python 中,创建以双下划线开头的函数会将函数名称更改为 _classname__methodname
,如此处所述 - https://www.python.org/dev/peps/pep-0008/#descriptive-naming-styles
所以尽量使用“实名”甚至更好,不要在“外部”使用时使用双下划线。如果你确实想使用双下划线,创建一个公开它的方法
我在从外部访问内部 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')
使用 _ 而不是 __。
在 python 中,创建以双下划线开头的函数会将函数名称更改为 _classname__methodname
,如此处所述 - https://www.python.org/dev/peps/pep-0008/#descriptive-naming-styles
所以尽量使用“实名”甚至更好,不要在“外部”使用时使用双下划线。如果你确实想使用双下划线,创建一个公开它的方法