06-私有变量和方法
在 Python 中,类的属性和方法默认是公有的(public),但可以通过 私有(private) 机制 限制外部访问。
虽然 Python 没有真正的私有变量,但可以使用 双下划线__
前缀来 模拟私有,让变量或方法 不能直接被外部访问。
1.私有变量(Private Variables)
- 定义私有变量
在 Python 类中:
self.变量名
是 公有(public)的,外部可以访问。self._变量名
仅是 约定俗成的保护变量(protected),仍然可以访问,但不建议外部直接访问。self.__变量名
是 私有变量(private),不能 直接被外部访问。
🔸 示例
class Person:
def __init__(self, name, age):
self.name = name # 公有变量
self._nickname = "无名" # 受保护变量(建议内部使用)
self.__age = age # 私有变量
def show_info(self):
return f"姓名: {self.name}, 年龄: {self.__age}"
p = Person("Alice", 25)
print(p.name) # ✅ 可以访问公有变量
print(p.show_info()) # ✅ 访问私有变量的方法
print(p.__age) # ❌ AttributeError: 'Person' object has no attribute '__age'
输出:
Alice
姓名:Alice,年龄:25
Traceback (most recent call last):
File "C:\Users\EDY\code\python-tutorial\包\__init__.py", line 16, in <module>
print(p.__age)
^^^^^^^
AttributeError: 'Person' object has no attribute '__age'
2.私有方法(Private Methods)
🔹 定义私有方法
def 方法名(self):
定义公有方法,可以被外部调用。def _方法名(self):
定义 受保护方法,约定 只能在类或子类中使用。def __方法名(self):
定义 私有方法,不能被外部直接调用。
🔸 示例
class Car:
def __init__(self, brand):
self.brand = brand
def start(self):
self.__engine_check() # 在内部调用私有方法
print(f"{self.brand} 启动")
def __engine_check(self): # 私有方法
print("发动机检测完成")
car = Car("Tesla")
car.start() # ✅ 通过公有方法 start() 间接调用私有方法
car.__engine_check() # ❌ AttributeError: 'Car' object has no attribute '__engine_check'
🔹 说明:
start()
是公有方法,可以外部调用。__engine_check()
是私有方法,不能外部调用,但可以在类的内部调用。