构造函数
__init__ (构造函数)实例化对象
class Person:
# 实例化一个人类
def __init__(self, hight, weight, sex):
self.hight = hight
self.weight = weight
self.sex = sex
new_person = Person(185, 80, women)
print(new_person.hight)
print(new_person.weight)
print(new_person.sex)
__new__ (构造函数)对象实例化前调用
class Women:
pass
class Person:
def __init__(self, high, weight, sex=None, name=None):
# 计算BMI指数
self.high = high
self.weight = weight
self.sex = sex
def __new__(cls, *args, **kwargs):
# print(args)
# print(kwargs)
# instance = Women()
instance = super().__new__(cls)
sex = kwargs.get("sex")
name = kwargs.get("name")
if sex == 'man':
good_weight = [(args[0]-80)*0.8, (args[0]-80)*0.6]
else:
good_weight = [(args[0]-70)*0.7, (args[0]-70)*0.5]
if good_weight[0] < args[1] < good_weight[1]:
instance.BMI = f"{name}:标准的, 请继续保持"
elif args[1] < good_weight[0]:
instance.BMI = f"{name}:偏瘦的, 需要补充营养"
else:
instance.BMI = f"{name}:偏胖的, 您需要减少食物摄入"
return instance
new_person = Person(182, 80, sex='man')
print(new_person.BMI)
__call__ (装饰器魔法函数)
# 计算函数运行时间
import time
class TimeCount:
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
start_time = time.time()
response = self.func(*args, **kwargs)
duration = time.time() - start_time
print(f"函数运行时间:{duration}")
return response
@TimeCount
def cooking(event):
print(f'{event} 将花费 5 秒')
time.sleep(5)
cooking('洗衣服')
# 带参数的装饰器
__repr__, __str__ 格式化类打印信息
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
# def __repr__(self):
# return self.name
def __str__(self):
return self.name + str(self.age)
print(Person('史政举', '20'))
print(repr(Person('史政举', '20')))
__len__ 计算对象长度
class LenCount:
def __init__(self, new_string):
self.new_string = new_string
def __len__(self):
return len(self.new_string.split('-'))
res = LenCount("123-456")
print(len(res))
__getitem__ 获取对象的key值
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __getitem__(self, item):
return getattr(self, item)
res = Person(name='史政举', age=20)
print(res["name"])
__setitem__ 设置对象值
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __getitem__(self, item):
return getattr(self, item)
def __setitem__(self, key, value):
setattr(self, key, value)
res = Person(name='史政举', age=20)
res["age"] = 21
print(res["age"])
__delitem__ 删除对象值
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __getitem__(self, item):
return getattr(self, item)
def __setitem__(self, key, value):
setattr(self, key, value)
def __delitem__(self, key):
delattr(self, key)
res = Person(name='史政举', age=20)
res["age"] = 21
delattr(res, "age")
print(res["age"])
__contains__ # 计算对象包含属性
class Person:
def __init__(self, age):
self.age = age
def __contains__(self, item):
if hasattr(self, item):
return True
else:
return False
print("age" in Person(12))
__getattribute__, __getattr__ # 获取对象属性,或函数
class Person:
def __getattribute__(self, item):
item = '_'+item
# super().__getattribute__(item)
return super().__getattribute__(item)
def _print_name(self):
print("my name is shizhengju")
res = Person()
res.print_name()
class Women:
hair = "long"
class Person:
black_hair = "short"
def __getattribute__(self, item):
if item == "hair":
item = "black_hair"
return super().__getattribute__(item)
def __getattr__(self, item):
return getattr(Women, item)
res = Person()
print(res.hair)
__setattr__ # 设置对象属性
class Person:
def __setattr__(self, name, value):
super().__setattr__(name, name+":"+value)
res = Person()
setattr(res, 'name', '史政举')
print(res.name)
__enter__, __exit__ with 上下文管理器
class MysqlHandler:
def __init__(self, database: Dict):
if not database:
raise ValueError(f"【数据库错误】请输入数据库链接信息")
self.database = database
def __enter__(self):
self.conn = connect(**self.database)
self.cursor = self.conn.cursor()
return self.cursor
def __exit__(self, exc_type, exc_val, exc_tb):
self.cursor.close()
self.conn.close()
__add__, __sub__, __mul__, __truediv__ # 加减乘除
# 列表相减
class NewList:
def __init__(self, list_type):
self.l = list_type
def __sub__(self, other):
res = set(self.l) - set(other.l)
return list(res)
l1 = NewList([1, 2, 3])
l2 = NewList([1,2])
print(l1-l2)
# 字典相加
class NewDict:
def __init__(self, dict_type):
self.d = dict_type
def __add__(self, other):
self.d.update(other.d)
return NewDict(self.d)
d1 = NewDict({"name": "史政举"})
d2 = NewDict({"age": "20"})
d3 = NewDict({"handsome": True})
res = d1+d2+d3
print(res.d)