🐍Python 函数与面向对象

classmethodstaticmethod与property

面试回答

常见问法

实例方法、@classmethod@staticmethod@property 分别适合什么场景?

回答

  • 实例方法:第一个参数是 self,操作对象实例状态
  • @classmethod:第一个参数是 cls,操作类级别状态,常用于工厂方法
  • @staticmethod:不依赖实例和类状态,更像放在类命名空间下的普通函数
  • @property:把方法伪装成属性访问,常用于封装和校验
class User:
    count = 0

    def __init__(self, name):
        self.name = name
        User.count += 1

    @classmethod
    def from_dict(cls, data):
        return cls(data["name"])

    @staticmethod
    def is_valid_name(name):
        return bool(name)

    @property
    def upper_name(self):
        return self.name.upper()

追问

  • 为什么工厂方法常用 classmethod
  • staticmethod 和模块级函数怎么选
  • property 为什么比直接暴露字段更灵活

原理展开

classmethod 的核心价值在于“支持子类继承后仍返回正确类实例”:

class Base:
    @classmethod
    def build(cls):
        return cls()

如果用硬编码类名,就不利于继承扩展。

property 则让外部访问保持简单:

class Person:
    def __init__(self, age):
        self._age = age

    @property
    def age(self):
        return self._age

    @age.setter
    def age(self, value):
        if value < 0:
            raise ValueError("age must be >= 0")
        self._age = value

易错点

  • staticmethod 当成“更高级的方法”
  • 不知道 classmethod 对继承友好
  • 以为 property 只是语法好看,忽略封装价值