python 魔法函数 1

构造函数

__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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值