# ### __call__ 魔术方法
'''
触发时机:把对象当作函数调用的时候自动触发
功能: 模拟函数化操作
参数: 参数不固定,至少一个self参数
返回值: 看需求
'''
# (1)基本语法
class MyClass():
def __call__(self):
print("__call__方法被调用")
return "done"
obj = MyClass()
res = obj()
print(res)
# (2) 模拟洗衣服的过程
class Wash():
# 使用call方法,进行统一的调用
def __call__(self,something):
self.something = something
print("以下是洗{}的过程:".format(something))
self.step1()
self.step2()
self.step3()
def step1(self):
print("第一步放水,把{}扔盆里".format(self.something))
def step2(self):
print("第二部导入洗衣液,金纺,蓝月亮,吊牌洗衣皂扔盆里搓")
def step3(self):
print("第三部晒一下,穿上")
obj = Wash()
# 一边写一边骂街
# obj.step1()
# obj.step2()
# obj.step3()
# 小王是个快乐的孩子
obj("裤衩")
# (3) 模拟内置int方法实现myint
# print(int(-5.9))
import math
class MyInt():
def stoi(self,n,sign=1):
res = n.lstrip("0")
if res == "":
return 0
num = eval(res) * sign
return num
def __call__(self,n):
# 判断的是布尔类型
if isinstance(n,bool):
if n == True:
return 1
else:
return 0
# 判断的是整型
elif isinstance(n,int):
return n
# 判断的是浮点型
elif isinstance(n,float):
if n < 0:
return math.ceil(n)
else:
return math.floor(n)
# 判断的是字符串
elif isinstance(n,str):
if (n[0] == "-" or n[0] == "+") and n[1:].isdecimal():
if n[0] == "+":
sign = 1
elif n[0] == "-":
sign = -1
return self.stoi(n[1:],sign)
elif n.isdecimal():
# 如果能够走到这个条件,一定没有带任何正负号
return self.stoi(n)
else:
return "对不起,老弟,这个算不了"
else:
print("对不起,老哥,这个算不了")
myint = MyInt()
res =myint(False)
print(res)
res = myint(5)
print(res)
res = myint(-5.5)
print(res)
# res = eval("123454")
# print(res,type(res))
# res = myint("12345")
# print(res,type(res))
# res = int("-00000000000111222abcdfrf")
# print(res)
# res = myint("+00000000000111222")
res = myint("*&^%$#@00000000000000000")
print(res)
# res = int("*&^%$#@00000000000000000")
# res = eval("")
# print(res)
res = int(5+6)
print(res)
res = myint(5*6)
print(res)
# res = myint([1,3,4])
res = int([1,3,4])
print(res)