【python 语法】class

2024-01-15 00:00:00

目录:

@classmethod: 类方法

类方法,直接通过 类名.类方法 调用。类方法的第一个参数 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年)

@staticmethod: 静态方法

不依赖于类的实例或类本身的状态,本质上是一个被组织在类命名空间内的普通函数。

场景1:封装工具函数或通用算法

在一个数学工具类或字符串处理类中,封装一些独立的计算函数

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)

场景2:实现与类相关的验证或辅助逻辑

在创建实例前验证输入数据的有效性

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

场景3:组织代码,提高内聚性

将一系列功能相关但无状态的函数组织在一个类中,使代码结构更清晰

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岁)'

返回首页

本文总阅读量  次
皖ICP备17026209号-3
总访问量: 
总访客量: