'''
在字符串拼接的时候,字符串可以直接相加,那么自定义的类可以实现吗?
'''
'''
# 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()) #实现了类实例调用时,输出边长