__call__ 魔术方法

Posted huangjiangyong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了__call__ 魔术方法相关的知识,希望对你有一定的参考价值。

# ### __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)

  

以上是关于__call__ 魔术方法的主要内容,如果未能解决你的问题,请参考以下文章

魔术方法之__call与__callStatic方法

PHP中的11个魔术方法总结:__construct,__destruct__call等

PHP魔术方法之__call与__callStatic方法

魔术方法 __tostring __debugInfo __call

PHP面向对象魔术方法之__call函数

php类知识---魔术方法__toString,__call,__debugInfo