Python 基础之类

1. 类

class ClassName: 
    def __init__(self, param1, ...): 
       ...
    def method_name(self, param1, ...):  
       ...

1.1 初始化方法 __init__()

初始化方法(也称构造函数)只在生成类的实例时被调用一次
方法的第一个参数 self 表示自身的实例

注:

  1. self 不是 python 关键字,换成别的单词也行
  2. Python 不支持多重构造函数

1.2 实例化

Python 中没有 new,类的实例化类似函数调用方式,比如:

# 导入整个模块
import dog
mydog = dog.Dog('pet', 2)
# 导入模块中的类
from dog import Dog
mydog = Dog('pet', 2)

1.3 子类继承父类

class ChildClass(ParentClass):
  ...

2. pydantic 模块

pip install pydantic
Pydantic 的核心是基于类型注解(Type Annotations)来定义字段,并自动处理数据验证和解析

特点:
必填字段:没有默认值的字段是必填的
可选字段:可以通过设置默认值或使用 Optional 类型使其变为可选

phone: Optional[str] = None
or 
phone: Union[str, None] = None
or 
phone: str | None = None # Python 3.10 以上

示例:

import json
from typing import Optional
from pydantic import BaseModel

class Student(BaseModel):
    name: str
    age: int
    is_boarding: bool  # 是否住校
    phone: Optional[str] = None  # 可选字段
    courses: list[str]

if __name__ == '__main__':

    student = Student(name="Alan", age=30, is_boarding=True, courses=["math", "english"])

    # 查看类属性和方法
    print(dir(student))
    
    print(student.__dict__)
    print(vars(student))

    # 转为json串
    jsonStr = student.model_dump_json(indent=4, exclude_none=True)

    # json串转为字典
    data_dict = json.loads(jsonStr)
    # pydantic 将字典转为对象,通过**操作符将字典中的键值对传递给Student类的构造函数
    new_student = Student(**data_dict)
    print(new_student)

3. 方法的类型

类方法与普通函数只有一个特别的区别:
类方法必须有一个额外的第一个参数名称,按照惯例它的名称是 self

3.1 实例方法

实例方法的第一个参数是 self,它指向了类的实例(对象)
通过 self 访问实例属性和其他实例方法

class MyClass:
    def my_method(self, arg):
        print(arg)

调用方式

obj = MyClass()
obj.my_method('demo')

3.2 类方法

类方法使用 @classmethod 装饰器定义,其第一个参数是 cls,代表类本身而不是某个具体的对象实例

class MyClass:
    @classmethod
    def my_class_method(cls, arg):
        print(arg)

调用方式:可以通过类直接调用,也可以通过类的实例调用

MyClass.my_class_method('demo')

# or 类的实例调用
obj = MyClass()
obj.my_class_method('demo')

3.3 静态方法

静态方法使用装饰器 @staticmethod 定义,不接受 self 或 cls 参数
静态方法不能访问类(cls)或实例(self)的任何信息

class MyClass:
    @staticmethod
    def my_static_method(arg):
        print(arg)

4. 其他

4.1 专有方法

  • __new__: 创建实例
  • __int__: 初始化实例,相当于构造函数
  • __call__: 将一个类实例当做函数调用
  • __del__: 析构函数,释放对象时使用

4.2 cls vs self

  • cls 是类的引用,出现在 __new__() 方法中
  • self 是实例的引用,出现在 __init__() 方法中
class MyClass:
    def __new__(cls, *args, **kwargs):
        print("Creating a new instance of MyClass")
        return super(MyClass, cls).__new__(cls)

    def __init__(self, name, doc):
        self.name = name
        self.doc = doc
        print(f"Initializing {name} with doc: {doc}")


# 创建实例
obj = MyClass("example", "This is an example object")

__new__() 负责创建一个新的实例,并返回这个实例,通常要调用super().__new__()
__init__() 负责初始化新创建的实例,通常情况下,__init__ 方法会在 __new__ 返回实例后被调用

4.3 类属性与实例属性

Python 是动态语言,可以在运行时为对象动态添加属性

4.4 __slots__ 限制属性

__slots__ 是一个特殊的类变量,用于限制类的实例只能拥有指定的属性,防止动态添加属性

class Person:
    __slots__ = ("name", "age")

    def __init__(self, name, age):
        self.name = name
        self.age = age

# 创建对象
person = Person("Alice", 30)
# person.gender = "Female"  # 报错: AttributeError

4.5 序列化

与 Java 的 Serializable 不同,Python 中的类默认是可以被 pickle 序列化的,除非类中包含不可序列化的属性

5. 元类(metaclass)

元类(metaclass)是创建类的“类”,即它们控制着类是如何被创建的
metaclass 参数提供了一种强大的机制来改变类的行为或结构,在需要对类进行高级定制时非常有用

5.1 自定义元类

  1. 定义一个元类,继承自 type
  2. 重写 __new__ 或者 __init__ 方法
  3. 使用 metaclass 参数指定你的元类
class MyMetaClass(type):
    def __new__(cls, name, bases, dct):
        print("Creating class: ", name)
        return super().__new__(cls, name, bases, dct)

class MyClass(metaclass=MyMetaClass):
    pass

5.2 代码分析

# abc.py

try:
    from _abc import (get_cache_token, _abc_init, _abc_register,
                      _abc_instancecheck, _abc_subclasscheck, _get_dump,
                      _reset_registry, _reset_caches)
except ImportError:
    from _py_abc import ABCMeta, get_cache_token
    ABCMeta.__module__ = 'abc'
else:
    class ABCMeta(type):
        ...


class ABC(metaclass=ABCMeta):
    __slots__ = ()

先从 _abc 导入所需组件,成功则执行 ABCMeta 元类
若 except ImportError, 则从 _py_abc 模块中导入 ABCMeta

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。