1. 类
class ClassName:
def __init__(self, param1, ...):
...
def method_name(self, param1, ...):
...
1.1 初始化方法 __init__()
初始化方法(也称构造函数)只在生成类的实例时被调用一次
方法的第一个参数 self 表示自身的实例
注:
- self 不是 python 关键字,换成别的单词也行
- 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 自定义元类
- 定义一个元类,继承自 type
- 重写
__new__
或者__init__
方法 - 使用 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