python-自定义@修饰符
__new__函數(shù)
在實(shí)例化開(kāi)始之后,在調(diào)用 __init__()方法之前,Python 首先調(diào)用 __new__() 方法
#單例1 class Singleton1(object):_inst=None# 在實(shí)例化開(kāi)始之后,在調(diào)用 __init__() 方法之前,Python 首先調(diào)用 __new__() 方法def __new__(cls,*args, **kwargs):if cls._inst is None:# 如果要得到當(dāng)前類(lèi)的實(shí)例,應(yīng)當(dāng)在當(dāng)前類(lèi)中的 __new__() 方法語(yǔ)句中調(diào)用當(dāng)前類(lèi)的父類(lèi)的 __new__() 方法cls._inst = super(Singleton1, cls).__new__(cls) #相當(dāng)于object.__new__(cls)return cls._inst#單例2 class Singleton2(object):def __new__(cls,*args, **kwargs):if not hasattr(cls,'_inst'):cls._inst = object.__new__(cls)return cls._instif __name__ == '__main__':print(Singleton1())print(Singleton1())print(Singleton2())print(Singleton2()) ''' 遇到問(wèn)題沒(méi)人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書(shū)! ''' class Person(object):def __init__(self, name, age):self.name = nameself.age = agedef __new__(cls, name, age):if 0 < age < 150: return super(Person, cls).__new__(cls) #return object.__new__(cls)else:return Nonedef __str__(self):return '{0}({1})'.format(self.__class__.__name__, self.__dict__)print(Person('Tom', 10)) print(Person('Mike', 200))@staticmethod、@classmethod修飾符
我們知道對(duì)于一個(gè)普通的類(lèi),我們要使用其中的函數(shù)的話(huà),需要對(duì)類(lèi)進(jìn)行實(shí)例化,而一個(gè)類(lèi)中,某個(gè)函數(shù)前面加上了staticmethod或者classmethod的話(huà),那么這個(gè)函數(shù)就可以不通過(guò)實(shí)例化直接調(diào)用
- @staticmethod不需要表示自身對(duì)象的self和自身類(lèi)的cls參數(shù),就跟使用函數(shù)一樣。
如果在@staticmethod中要調(diào)用到這個(gè)類(lèi)的一些屬性方法,只能直接類(lèi)名.屬性名或類(lèi)名.方法名。 - @classmethod也不需要self參數(shù),但第一個(gè)參數(shù)需要是表示自身類(lèi)的cls參數(shù)。
而@classmethod因?yàn)槌钟衏ls參數(shù),可以來(lái)調(diào)用類(lèi)的屬性,類(lèi)的方法,實(shí)例化對(duì)象等,避免硬編碼。
@property修飾符
property使方法像屬性一樣調(diào)用,就像是一種特殊的屬性
有參函數(shù)時(shí),@name.setter
''' 遇到問(wèn)題沒(méi)人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書(shū)! ''' class Animal(object):def __init__(self,name):self.name = name@propertydef intro(self):print('there is a %s eating'%(self.name))@intro.setterdef intro(self,value):print('there is %d %s eating'%(value,self.name))a = Animal('cat') a.intro a.intro=2@修飾符
從第一個(gè)函數(shù)修飾符開(kāi)始,自下而上做參數(shù)傳遞
#無(wú)參修飾 ,無(wú)參數(shù)時(shí)不需要調(diào)用 def log1(func):func() @log1 def test():print('test:')#有參修飾 def log2(func):def inner(*args, **kwargs):func(*args, **kwargs)return inner @log2 def test(num):print('testlog2:',num,test.__name__) test(20) #相當(dāng)于log(test(20))from functools import wraps #可以看見(jiàn)@wraps可以保證裝飾器修飾的函數(shù)的name的值保持不變#不參數(shù)的裝飾器 def log3(func):@wraps(func)def inner(*args, **kwargs,):func(*args, **kwargs)return inner @log3 def test(num):print('testlog3:',num,test.__name__) test(30) #相當(dāng)于log(test(30))@pysnooper修飾符
日志打印工具,用顯示函數(shù)間的入?yún)⒑头祷刂档淖兓?/p> ''' 遇到問(wèn)題沒(méi)人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書(shū)! ''' import pysnooper@pysnooper.snoop() #@pysnooper.snoop('log.log') def lisy(a):b=[x - 10 if x in [11, 12, 13] else x for x in a]return b print(lisy([1,2,3,11,12,13,'111',222]))
總結(jié)
以上是生活随笔為你收集整理的python-自定义@修饰符的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python-上传文件的几种方式
- 下一篇: python中json.load()、j