魔法方法

'''
在字符串拼接的时候,字符串可以直接相加,那么自定义的类可以实现吗?
'''
'''
# def __add__(self, other):方法使用举例
# '''
class Retangle():
    def __init__(self,chang,kuan):
        self.chang = chang
        self.kuan = kuan
    def area(self):
        return  self.chang*self.kuan
    def __add__(self, other):
        add_chang  = self.chang + other.chang
        add_kuan = self.kuan + other.kuan
        return add_chang,add_kuan
b = Retangle(2,3) #可以理解为self.chang与self.kuan
d = Retangle(3,4) #可以理解为后面传进来的other.chang与other.kuan
print(b+c) #结果为(5,7),使用加号的话,便会默认使用__add__方法

c = b.area()
print(c)
# ------------魔术方法之运算方法-------------------------
 '''
__add__(self,other) #x+y
__sub__(self,other) #x-y
__mul__(self,other) #x*y
__mod__(self,other) #x%y
__iadd__(self,other) #x+=y
__isub__(self,other) #x-=y
__radd__(self,other) #y+x
__rsub__(self,other) #y-x
__imul__(self,other) #x*=y
__imod__(self,other) #x%=y
 '''

# -------------了解__repr__方法----------------------
class A():
    def __init__(self,name):
        self.name = name
    def __repr__(self):
        return "123" #注意必须是返回值形式,必须是字符串.
a = A("戴维") #自动调用__repr__方法,将repr返回值赋给a
print(a) #之前没有__repr__方法时,a是一个实例对象:<__main__.A object at 0x7f6a722db5c0>,现在是:123,将返回值输出.

# -------------了解__str__方法----------------------
class B():
    def __init__(self):
        pass
    def __str__(self):
        return "str的返回值"
b = B() #自动调用__str__方法,将__str__方法返回值赋给b
print(b) #str的返回值

# #---------两个方法在类中一起出现,了解优先级------------------
class C():
    def __str__(self):
        return "我是str的返回值"
    def __repr__(self):
        return "我是repr的返回值"
c = C()
print(c) #我是str的返回值,__str__方法优先于__repr__方法.


# -----------------类的实例的调用--------------------
'''
类的实例可以像函数一样去调用吗?可以.使用__call__方法
'''
class Solve():
    def __init__(self,name):
        self.name = name
    def __call__(self, *args, **kwargs):
        return "1234" #一般在用的时候会将类中其他方法的输出以返回值形式返回出去,这样在实例调用时,便可以直接使用.
s = Solve("David")
print(s()) #s()实例的调用:1234

#将计算好的值返回出去

'''
__str__方法及__call__应用
定义正方形类(继承矩形类)。实现类的实例可调用,调用时打印边长; 
同时,直接打印类实例时能够打印出实例的面积.
'''
class Area():
    def __init__(self,chang,kuan):
        self.chang = chang
        self.kuan = kuan
    def __str__(self): #用于实现直接打印实例时,可以打印面积
        a = self.kuan*self.chang
        return str(a) #在第一次写代码时,我写的直接返回a,结果报错提示,a时int型,不是str型,因此将它转换.
    def __call__(self, *args, **kwargs): #用于实现类的实例调用时,打印边长
        return self.chang
s = Area(12,12)
print(s) #144
print(s()) #实现了类实例调用时,输出边长

 

转载于:https://www.cnblogs.com/jb9527/p/10609685.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值