类属性与方法
- 类的私有属性:两个下划线开头
- 类的私有函数:两个下划线开头
在 Python 里,一个下划线开头的变量(例如 self._value)仍然属于 public 命名空间,解释器不会做任何访问限制,外部依旧可以访问。
# file: test_underscore.py
class Demo:
def __init__(self):
self.public = 1
self._internal = 2 # 单下划线
self.__private = 3 # 双下划线(触发 name mangling)
if __name__ == "__main__":
d = Demo()
print("public :", d.public) # 1
print("_internal:", d._internal) # 2 —— 正常访问
try:
print("__private:", d.__private)
except AttributeError as e:
print("访问 __private 失败:", e)
# 真想看“伪私有”也能看到,但名字被改了
print("改名后:", d._Demo__private) # 3
- 实例方法:
在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数,self 代表的是类的实例。
self 的名字并不是规定死的,也可以使用 this,但是最好还是按照约定使用 self。
- 类的方法:@classmethod 用来把方法绑定到类本身,而不是实例。
class MyClass:
@classmethod
def 方法名(cls, 其它形参...):
"""类方法的第一个参数必须是 cls,它代表类本身。"""
...
class MyClass:
class_variable = "This is a class variable"
@classmethod
def class_method(cls):
return f"Class method called. Class variable: {cls.class_variable}"
# 通过类调用类方法
print(MyClass.class_method())
# 通过实例调用类方法
obj = MyClass()
print(obj.class_method())
- 静态方法:方法不依赖 cls 或 self
class MyClass:
class_variable = "This is a class variable"
# 静态方法(无默认参数,不绑定类或实例)
@staticmethod
def static_method():
return f"Static method called. Class variable: {MyClass.class_variable}"
# 类和实例均可调用(无需传参)
print(MyClass.static_method())
obj = MyClass()
print(obj.static_method())
- 类方法注解
@property ┐
@setter ┤ → 属性管理
@deleter ┘
@cached_property → 缓存
@staticmethod → 无 self
@classmethod → 有 cls
@abstractmethod → 接口
@lru_cache → 缓存
@total_ordering → 比较
@final → 禁止重写
@dataclass → 样板代码
自定义装饰器 → 任意逻辑