python @修饰符_python-自定义@修饰符

__new__函数

在实例化开始之后,在调用 __init__() 方法之前,Python 首先调用 __new__() 方法

ContractedBlock.gif

ExpandedBlockStart.gif

#单例1

classSingleton1(object):

_inst=None#在实例化开始之后,在调用 __init__() 方法之前,Python 首先调用 __new__() 方法

def __new__(cls,*args, **kwargs):if cls._inst isNone:#如果要得到当前类的实例,应当在当前类中的 __new__() 方法语句中调用当前类的父类的 __new__() 方法

cls._inst = super(Singleton1, cls).__new__(cls) #相当于object.__new__(cls)

returncls._inst#单例2

classSingleton2(object):def __new__(cls,*args, **kwargs):if not hasattr(cls,'_inst'):

cls._inst= object.__new__(cls)returncls._instif __name__ == '__main__':print(Singleton1())print(Singleton1())print(Singleton2())print(Singleton2())

View Code

ContractedBlock.gif

ExpandedBlockStart.gif

classPerson(object):def __init__(self, name, age):

self.name=name

self.age=agedef __new__(cls, name, age):if 0 < age < 150:return super(Person, cls).__new__(cls) #return object.__new__(cls)

else:returnNonedef __str__(self):return '{0}({1})'.format(self.__class__.__name__, self.__dict__)print(Person('Tom', 10))print(Person('Mike', 200))

View Code

@staticmethod、@classmethod修饰符

我们知道对于一个普通的类,我们要使用其中的函数的话,需要对类进行实例化,而一个类中,某个函数前面加上了staticmethod或者classmethod的话,那么这个函数就可以不通过实例化直接调用

@staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。

如果在@staticmethod中要调用到这个类的一些属性方法,只能直接类名.属性名或类名.方法名。

@classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数。

而@classmethod因为持有cls参数,可以来调用类的属性,类的方法,实例化对象等,避免硬编码。

ContractedBlock.gif

ExpandedBlockStart.gif

classAnimal(object):

name= 'dog'

def __init__(self,name):

self.name=namedefintro1(self):print('there is a %s'%(self.name))

@staticmethoddefintro2():print('there is a %s')

@classmethoddefintro3(cls):print('there is a %s'%(cls.name))

Animal('cat').intro1()

Animal.intro2()

Animal.intro3()

View Code

@property修饰符

property使方法像属性一样调用,就像是一种特殊的属性

有参函数时,@name.setter

ContractedBlock.gif

ExpandedBlockStart.gif

classAnimal(object):def __init__(self,name):

self.name=name

@propertydefintro(self):print('there is a %s eating'%(self.name))

@intro.setterdefintro(self,value):print('there is %d %s eating'%(value,self.name))

a= Animal('cat')

a.intro

a.intro=2

View Code

@修饰符

从第一个函数修饰符开始,自下而上做参数传递

ContractedBlock.gif

ExpandedBlockStart.gif

#无参修饰 ,无参数时不需要调用

deflog1(func):

func()

@log1deftest():print('test:')#有参修饰

deflog2(func):def inner(*args, **kwargs):

func(*args, **kwargs)returninner

@log2deftest(num):print('testlog2:',num,test.__name__)

test(20) #相当于log(test(20))

from functools importwraps#可以看见@wraps可以保证装饰器修饰的函数的name的值保持不变

#不参数的装饰器

deflog3(func):

@wraps(func)def inner(*args, **kwargs,):

func(*args, **kwargs)returninner

@log3deftest(num):print('testlog3:',num,test.__name__)

test(30) #相当于log(test(30))

View Code

@pysnooper修饰符

日志打印工具,用显示函数间的入参和返回值的变化

ContractedBlock.gif

ExpandedBlockStart.gif

importpysnooper

@pysnooper.snoop()#@pysnooper.snoop('log.log')

deflisy(a):

b=[x - 10 if x in [11, 12, 13] else x for x ina]returnbprint(lisy([1,2,3,11,12,13,'111',222]))

View Code

1518802-20191030152148874-700650211.png

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
©️2021 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值