Python的面向对象

36 阅读1分钟

类属性与方法

  • 类的私有属性:两个下划线开头
  • 类的私有函数:两个下划线开头

在 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           → 样板代码
自定义装饰器         → 任意逻辑