Python元类 & type动态创建类 & 类装饰器

元类

类也是对象(属于元类的对象)

      #打印字符串(字符串是对象)
      print("HelloWorld")  
     #打印类名,类同样为一个对象
     print(Person)

 

使用type可以动态创建类

     type(类名,由父类名称组成的元组(可以为空),包含属性的字典(名称和值))

#案例1:使用type创建类
Myclass = type("MyClass3",(),{})
m1 = Myclass()
print(type(m1))


 

#案例2:使用type创建带有属性(方法)的类
def show(self):
	print("---num---%d"%self.num)

# 使用元类(type)创建类
Test = type("Test",(),{"show":show})
t = Test()
t.num = 100
t.show()

#案例3:使用type动态创建一个继承指定类的类
class Animal():
	def __init__(self,color="Yellow"):
		self.color = color
	def eat(self):
		print("吃死你")
		
Dog = type("Dog",(Animal,),{})
dog = Dog()
dog.eat()
print(dog.color)

类装饰器

和函数装饰器类似,只不过你在返回func的时候显示对象不能被调用,重写__call__()方法后,对象可以直接进行调用

Test 等价于 test = Test(test) 装饰器特性

Test(test)的这个test就是func

class Test(object):
	def __init__(self,func):
		print("--初始化--")
		print("func name is %s"%func.__name__)
		self.__func = func
	# 重写该方法后,对象可以直接进行调用
	def __call__(self):
		print("--装饰器中的功能--")
		self.__func()
	
# @Test 等价于 test = Test(test) 装饰器特性
@Test
def test():
	print('--test 函数---')
	# 本身test指向函数test,但是装饰器将test指向了对象。
	# 对象本身不可以被调用,但是重写__call__方法之后则会被调用
test()

注意类装饰器的形式是非主流的形式,以后要加功能就写闭包

当别人写了类装饰器你认得就可以了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值