欢迎来到十九分快乐的博客

生死看淡,不服就干。

5.魔术方法-2

魔术方法第二部分

1. __str__魔术方法

# 1.__str__魔术方法
"""
触发时机 : 使用print(对象)打印对象或者str(对象)强转对象时触发
功能 : 查看对象
参数 : 一个self就收当前对象
返回值 : 必须返回字符串类型
"""
class Cat():
    gift = "好奇心"
    def __init__(self,name):    
        self.name = name
    def info(self):
        return "猫的名字叫{},天赋{}".format(self.name,self.gift)
    def __str__(self):
        return self.info()
        
tom = Cat("tom")
print(tom) #打印对象触发
res = str(tom) #强转str类型触发
print(res)

2. __repr__魔术方法

# 2.__repr__魔术方法
"""
触发时机 : 使用repr(对象)的时候触发
功能 : 查看对象 ,与__str__相似
参数 : 一个self就收当前对象
返回值 : 必须返回字符串类型
"""

class Mouse():
    gift = "打洞"
    def __init__(self,name):
        self.name = name
    def info(self):
        return "我是{},我喜欢{}".format(self.name,self.gift)
    def __repr__(self):
        return self.info()

jerry = Mouse("jerry")
res = repr(jerry)
print(res)
"""
在print(对象)或者str强转对象时,依旧触发__repr__
原因是 : 系统在底层加入了如下语句
    __str__ = __repr__
"""
print(jerry)
res = str(jerry)
print(res)

3. bool魔术方法

# 3.__bool__魔术方法
"""
触发时机 : 使用bool(对象)的时候触发
功能 : 强转对象
参数 : 一个self就收当前对象
返回值 :必须是布尔类型
"""
class Bo():
    def __bool__(self):
        return False
obj = Bo()
res = bool(obj) #强转对象时触发
print(res) #False

"""
类似的魔术方法还有如下等等:
__complex__(self) 使用complex(对象)时触发,返回值必须是虚数
__int__(self)           使用int(对象)时触发,返回值必须是整数
__float__(self)        使用float(对象)时触发,返回值必须是浮点数
    ...
"""

4. add (radd) 魔术方法

# 4.__add__魔术方法(__radd__反向加法)
"""
触发时机 : 使用对象进行加法运算时自动触发
功能 : 对象加法运算
参数 : 两个对象参数(self,other)
返回值 : 运算后的结果
"""
class Jia():
    def __init__(self,num):
        self.num = num
    def __add__(self,num):
        return self.num + num
    def __radd__(self,num):
        return num + self.num

obj = Jia(5)
# 对象在加号左边,自动触发__add__魔术方法
res = obj +5
print(res) #10
# 对象在加号右边,自动触发__radd__魔术方法
res = 3 + obj
print(res) #8

"""
类似的魔术方法还有如下等等:(都需要两个参数)
__sub__(__rsub__)       定义减法(subtraction)的行为: -
__mul__(__rmul__)      定义乘法(multiplication)的行为: *
__truediv__(__rtruediv__) 定义真除法的行为 : /
"""
class Chu():
    def __init__(self,num):
        self.num = num
    def __truediv__(self,num):
        return (self.num / num) if num != 0 else "0不能做除数"
    def __rtruediv__(self,num):
        return (num / self.num) if self.num != 0 else "0不能做除数"

obj = Chu(10)
res = obj / 4
print(res) #2.5
res = obj / 0
print(res) #0不能做除数
obj = Chu(0)
res = 10 / obj
print(res) #0不能做除数

5. len 魔术方法

# 5.__len__魔术方法
"""
触发时机 : 使用len(对象)的时候触发
功能 : 用于检测对象中或类中成员个数
参数 : 一个self就收当前对象
返回值 : 必须是整数
"""
# 检测对象中成员个数
class Me():
    a = 1
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def func(self):
        pass
    def __len__(self):
        return len(self.__dict__)

obj = Me("tom",3)
res = len(obj) #触发魔术方法
print(res) #2
obj.sex = "男"
res = len(obj)
print(res) #3

# 检测类中成员个数
class My():
    a = 1
    __b = 2
    def func(self):
        pass
    def __info(self):
        pass
    def __len__(self):
        lst = []
        dic = My.__dict__
        for i in dic:
            # 筛选掉类中的魔术属性
            if not(i.startswith("__") and i.endswith("__")):
                lst.append(i)
        return len(lst)
"""
魔术方法里面可以简写成推导式: 
    return len([i for i in My.dict if not(i.starswith("__") and i.endswith("__"))])
"""
obj = My()
res = len(obj) 
print(res) #4

posted @ 2020-12-18 21:51  十九分快乐  阅读(54)  评论(0编辑  收藏  举报