序列的创建与迭代
__iter__
iter() 空间复杂度 节省空间
next()
__getitem__ 对复杂数据,查询效率高,有index索引
时间复杂度,空间复杂度
容器对象
__contains__()
检查成员是否符合某种资格,返回bool
# ############### 定义 ###############
class Foo:
def func(self):
pass
# 定义property属性
@property
def prop(self):
pass
# ############### 调用 ###############
foo_obj = Foo()
foo_obj.func() # 调用实例方法
foo_obj.prop # 调用property属性
property属性的定义和调用要注意一下几点:
定义时,在实例方法的基础上添加 @property 装饰器;并且仅有一个self参数
调用时,无需括号
什么是property属性
一种用起来像是使用的实例属性一样的特殊属性,可以对应于某个方法
class 动态处理对象
__call__ 魔术方法
链式调用。
class obj:
def __init__(self,name,age) -> None:
self.name = name
self.age = age
def __call__(self, weight) -> None:
self.weight = weight
print(self.name,self.age,self.weight)
return self
person = obj('sunyang','1')
# print(person)
callable(person)
its_me = person(100)
lig = its_me(90)
print(lig.name,lig.age,lig.weight)
sunyang 1 100
sunyang 1 90
sunyang 1 90
class str 和 repr 魔术方法
__str__ 普通输出打印 __repr__ 对机器可读
克隆python对象
复制可变 或 不可变对象
copy.copy()
copy.deepcopy()
提升Python技能 更多Pythonic类约定 自定义异常类
import string
MMIN_PASSWORD_LENGTH = 12
def less_length(password:str ,min_length) -> bool:
return len(password) < min_length
# EMPTY_SET 是否有交集,没有 set() == 空集合 ruturn Ture : 抛出异常
def lack_of_lowercase(password:str ) -> bool:
return set(password) & set(string.punctuation) == EMPTY_SET
def valiadata_panssword(
password:str,
min_length : int = MMIN_PASSWORD_LENGTH)-> None:
if less_length(password,min_length) or\
lack_of_lowercase(password):
raise ValueError
print('ok')
pass
print(string.punctuation)
adc 模块 抽象基类
实现接口 ,给指定契约,设计蓝图
from ads import
class Foo:
def __getitem__(self, index):
...
def __len__(self):
...
def get_iterator(self):
return iter(self)
class MyIterable(ABC):
@abstractmethod
def __iter__(self):
while False:
yield None
@abstractmethod
def get_iterator(self):
return self.__iter__()
@classmethod
def __subclasshook__(cls, C):
if cls is MyIterable:
if any("__iter__" in B.__dict__ for B in C.__mro__):
return True
设计模式 工厂方法
from typing im
%%file player.py
from abc import abstractmethod, ABC
class Player (ABC) :
def init_ (self, name, role):
self.name = name
self.role = role
@abstractmethod
def action(self):
“"球员的动作”"
def str(self):
return 'name={self.name}, role={self.role}
from player import Player
player_creation_functions:dict[str, Callable[..., Player]] = {}
def register (role: str, creation_function: Callable[..., Player]) -› None:
player_creation_functions[role] = creation_function
def unregister (role: str)-› None:
player_creation_functions.pop(role, None)
def create(args: dict[str,Any]) -› Player:
the_args = args.copy()
role = the_args['role']
try:
creation_function = player_creation_functions[role]
return creation_function(**the args)
except KeyError:
raise ValueError(f'未知的角色 froel!r') from None