🐍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只是语法好看,忽略封装价值