一、类装饰器
理论知识:在python中所有的数据类型都是对象,函数自然也是;装饰器也是一个函数,即:对象;对象是由class产生的;所以,装饰器也可是类装饰器;
函数装饰器:(举例:打印运行函数的函数名称)
def foo(func):
def warp():
print func._name_
return func()
return warp
类装饰器:
class Foo(func):
def __init__(self):
pass
def __call__(self,func):
def warp():
print func.__name__
return func()
return warp
当一个类具有__call__方式之后,那么它的实例就是一个可调用对象;使用和函数有一点不同;
#如果是函数装饰器,就直接@Foo,如果是类装饰器,则先将类进行实例化@Foo()
@Foo()
def bar():
pass
bar() ##--->bar
二、内省机制
python中一个非常好的内省机制。即:支持我们在程序执行过程中,动态的查询、获取、访问特定的对象属性。这个机制在某些场景下非常实用。python中有很多内置函数、属性、模块;下面简单举例一些常用的函数和属性方法。
hasattr:判断对象是否具有特定的成员(如:属性、方法)
getattr:从对象中获取特定的成员(如:属性、方法)
setattr:给对象设置特定的成员(如:属性等)
__file__:获取对象字节码文件所在路径
__name__:获取当前模块的名称
__module__:获取实例对象所属的模块名。
inspect:python内省库
下面简单代码举例:
# -*-coding:utf-8 -*-
class Test(object):
name="tester"
def say_name(self):
print("my name is %s"%Test.name)
print(dir(Test)) #----->显示所有的Test包含的属性、方法
# ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__',
# '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__',
# '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
# '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__',
# 'name', 'say_name']
print(hasattr(Test,"name")) #---->True 因为:Test类中包含了name变量
print(hasattr(Test,"say_name")) #---->True 因为:Test类中包含了say_name函数
print(hasattr(Test,"__init__")) #---->True 因为:Test类中自带了__init__函数(每个类都有)
print(getattr(Test,"name")) #---->tester
print(getattr(Test,"say_name")) #----><function Test.say_name at 0x00000221031462F0>
#下面说明类、对象、函数
say_name_def=getattr(Test,"say_name")
test=Test()
say_name_def(test) #---->my name is tester
setattr(Test,"age",28)
print(hasattr(Test,"age"))
print(dir(Test)) #---->这个结果与上面的结果比较,多了一个age
print(hasattr(Test,"age")) #---->True
print(getattr(Test,"age")) #---->28
python的内省库有很多魔法属性、方法,可以尝试,关于__main__等属性的解释见下面链接: