目录:
类方法,直接通过 类名.类方法 调用。类方法的第一个参数 cls 是类本身。
from datetime import date
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
def from_birth_year(cls, name, birth_year):
"""根据出生年份创建Person实例"""
current_year = date.today().year
age = current_year - birth_year
return cls(name, age) # 使用 cls 而不是 Person,支持继承
@classmethod
def from_dict(cls, data_dict):
"""从字典数据创建Person实例"""
return cls(data_dict['name'], data_dict['age'])
# 使用不同的工厂方法创建实例
person1 = Person("张三", 25) # 标准构造
person2 = Person.from_birth_year("李四", 1998) # 从出生年份构造
person3 = Person.from_dict({"name": "王五", "age": 30}) # 从字典构造
print(f"{person2.name} 的年龄是 {person2.age} 岁")
# 输出:李四 的年龄是 27 岁(假设当前是2025年)
不依赖于类的实例或类本身的状态,本质上是一个被组织在类命名空间内的普通函数。
在一个数学工具类或字符串处理类中,封装一些独立的计算函数
class MathUtils:
@staticmethod
def calculate_circle_area(radius):
"""计算圆的面积"""
return 3.14159 * radius ** 2
@staticmethod
def add(a, b):
"""加法运算"""
return a + b
# 直接通过类调用,无需实例化
area = MathUtils.calculate_circle_area(5)
sum_result = MathUtils.add(3, 7)
在创建实例前验证输入数据的有效性
class User:
def __init__(self, email):
# 在构造函数中使用静态方法进行验证
if not User.is_valid_email(email):
raise ValueError("无效的邮箱格式")
self.email = email
@staticmethod
def is_valid_email(email):
"""验证邮箱格式"""
return "@" in email and "." in email.split("@")[-1]
# 验证逻辑独立于任何用户实例
print(User.is_valid_email("test@example.com")) # 输出: True
将一系列功能相关但无状态的函数组织在一个类中,使代码结构更清晰
class TemperatureConverter:
@staticmethod
def celsius_to_fahrenheit(c):
return (c * 9/5) + 32
@staticmethod
def fahrenheit_to_celsius(f):
return (f - 32) * 5/9
# 像使用一个工具库一样使用这个类
print(TemperatureConverter.celsius_to_fahrenheit(100))
__repl__直接打印类的实例对象,默认会显示对象的内存地址前缀。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p = Person("小明", 25)
print(p) # <__main__.Person object at 0x100b01c10>
在类中定义 __repl__ 方法,可以自定义打印对象的内容。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f'姓名: {self.name}, 年龄: {self.age}'
p = Person("小明", 25)
print(p) # '姓名: 小明, 年龄: 25'
如果类中同时定义了 __repr__ 和 __str__ 方法,打印实例对象,__str__ 方法会优先调用。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f'姓名: {self.name}, 年龄: {self.age}'
def __str__(self):
return f"{self.name}({self.age}岁)"
p = Person("小明", 25)
print(p) # '小明(25岁)'
可以使用内置方法 repr() 和 str() 分别获取 __repl__ 和 __str__ 方法的返回值 。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f'姓名: {self.name}, 年龄: {self.age}'
def __str__(self):
return f"{self.name}({self.age}岁)"
p = Person("小明", 25)
print(repr(p)) # '姓名: 小明, 年龄: 25'
print(str(p)) # '小明(25岁)'
↶ 返回首页 ↶