摘要:它首先被程序語言的設(shè)計(jì)領(lǐng)域所采用并在和面向?qū)ο蠓矫嫒〉昧顺煽?。面向?qū)ο笾械姆瓷渫ㄟ^字符串的形式操作對(duì)象相關(guān)的屬性。注構(gòu)造方法的執(zhí)行是由創(chuàng)建對(duì)象觸發(fā)的,即對(duì)象類名而對(duì)于方法的執(zhí)行是由對(duì)象后加括號(hào)觸發(fā)的,即對(duì)象或者類執(zhí)行執(zhí)行邏輯題
isinstance和issubclass
1.isinstance(obj,cls)檢查是否obj是否是類 cls 的對(duì)象
#!/usr/bin/env python # -*- coding:utf-8 -*- class Foo: pass obj = Foo() print(isinstance(obj,Foo))
2.issubclass(cls,cls)檢查Bar是否是Foo的派生類
#!/usr/bin/env python # -*- coding:utf-8 -*- class Foo(object): pass class Bar(Foo): pass print(issubclass(Bar,Foo))反射
1.反射:
反射的概念是由Smith在1982年首次提出的,主要是指程序可以訪問、檢測和修改它本身狀態(tài)或行為的一種能力(自省)。這一概念的提出很快引發(fā)了計(jì)算機(jī)科學(xué)領(lǐng)域關(guān)于應(yīng)用反射性的研究。它首先被程序語言的設(shè)計(jì)領(lǐng)域所采用,并在Lisp和面向?qū)ο蠓矫嫒〉昧顺煽儭?br>2.python面向?qū)ο笾械姆瓷洌和ㄟ^字符串的形式操作對(duì)象相關(guān)的屬性。python中的一切事物都是對(duì)象(都可以使用反射)四個(gè)可以實(shí)現(xiàn)反射的函數(shù):
def hasattr(*args, **kwargs): # real signature unknown """ Return whether the object has an attribute with the given name. This is done by calling getattr(obj, name) and catching AttributeError. """ pass hasattr
def setattr(x, y, v): # real signature unknown; restored from __doc__ """ Sets the named attribute on the given object to the specified value. setattr(x, "y", v) is equivalent to ``x.y = v"" """ pass setattr
def delattr(x, y): # real signature unknown; restored from __doc__ """ Deletes the named attribute from the given object. delattr(x, "y") is equivalent to ``del x.y"" """ pass delattr
應(yīng)用:
#!/usr/bin/env python # -*- coding:utf-8 -*- class Foo: f = "類的靜態(tài)變量" def __init__(self,name,age): self.name=name self.age=age def say_hi(self): print("hi,%s"%self.name) obj=Foo("egon",73) #1.檢查是否含有某屬性 print(hasattr(obj,"name")) #有該屬性返回True print(hasattr(obj,"six")) #無該屬性返回False #2.獲取該屬性 n = getattr(obj,"name") print(n) func = getattr(obj,"say_hi") func() #3.設(shè)置屬性 setattr(obj,"sb",True) setattr(obj,"show_name",lambda self:self.name+"sb") print(obj.__dict__) #{"name": "egon", "age": 73, "sb": True, "show_name":at 0x0020C660>} print(obj.show_name(obj)) #egonsb #4.刪除屬性 delattr(obj,"age") delattr(obj,"show_name") delattr(obj,"show_name111")#不存在,則報(bào)錯(cuò) print(obj.__dict__)
類也是一種屬性
class Foo(object): staticField = "old boy" def __init__(self): self.name = "wupeiqi" def func(self): return "func" @staticmethod def bar(): return "bar" print(getattr(Foo,"staticField")) print(getattr(Foo,"func")) print(getattr(Foo,"bar"))
模塊:
import sys def s1(): print("s1") def s2(): print("s2") this_module = sys.modules[__name__] print(hasattr(this_module, "s1")) #True print(getattr(this_module, "s2")) #__str__和,__repr__
改變對(duì)象的字符串顯示__str__,__repr__
自定制格式化字符串__format__
format_dict={ "nat":"{obj.name}-{obj.addr}-{obj.type}",#學(xué)校名-學(xué)校地址-學(xué)校類型 "tna":"{obj.type}:{obj.name}:{obj.addr}",#學(xué)校類型:學(xué)校名:學(xué)校地址 "tan":"{obj.type}/{obj.addr}/{obj.name}",#學(xué)校類型/學(xué)校地址/學(xué)校名 } class School: def __init__(self,name,addr,type): self.name=name self.addr=addr self.type=type def __repr__(self): return "School(%s,%s)" %(self.name,self.addr) def __str__(self): return "(%s,%s)" %(self.name,self.addr) def __format__(self, format_spec): # if format_spec if not format_spec or format_spec not in format_dict: format_spec="nat" fmt=format_dict[format_spec] return fmt.format(obj=self) s1=School("oldboy1","北京","私立") print("from repr: ",repr(s1)) print("from str: ",str(s1)) print(s1) """ str函數(shù)或者print函數(shù)--->obj.__str__() repr或者交互式解釋器--->obj.__repr__() 如果__str__沒有被定義,那么就會(huì)使用__repr__來代替輸出 注意:這倆方法的返回值必須是字符串,否則拋出異常 """ print(format(s1,"nat")) print(format(s1,"tna")) print(format(s1,"tan")) print(format(s1,"asfdasdffd")) 打印結(jié)果: from repr: School(oldboy1,北京) from str: (oldboy1,北京) (oldboy1,北京) oldboy1-北京-私立 私立:oldboy1:北京 私立/北京/oldboy1 oldboy1-北京-私立
%s和%r的區(qū)別
class B: def __str__(self): return "str : class B" def __repr__(self): return "repr : class B" b = B() print("%s" % b) print("%r" % b) #打印結(jié)果為: str : class B repr : class Bitem
__getitem__\__setitem__\__delitem__
class Foo: def __init__(self,name): self.name=name def __getitem__(self, item): print(self.__dict__[item]) def __setitem__(self, key, value): self.__dict__[key]=value def __delitem__(self, key): print("del obj[key]時(shí),我執(zhí)行") self.__dict__.pop(key) def __delattr__(self, item): print("del obj.key時(shí),我執(zhí)行") self.__dict__.pop(item) f1=Foo("sb") f1["age"]=18 f1["age1"]=19 del f1.age1 del f1["age"] f1["name"]="alex" print(f1.__dict__)__new__
class A: def __init__(self): self.x = 1 print("in init function") def __new__(cls, *args, **kwargs): print("in new function") return object.__new__(A, *args, **kwargs) a = A() print(a.x)
class Singleton: def __new__(cls, *args, **kw): if not hasattr(cls, "_instance"): cls._instance = object.__new__(cls, *args, **kw) return cls._instance one = Singleton() two = Singleton() two.a = 3 print(one.a) # 3 # one和two完全相同,可以用id(), ==, is檢測 print(id(one)) # 29097904 print(id(two)) # 29097904 print(one == two) # True print(one is two) 單例模式__call__
對(duì)象后面加括號(hào),觸發(fā)執(zhí)行。
注:構(gòu)造方法的執(zhí)行是由創(chuàng)建對(duì)象觸發(fā)的,即:對(duì)象 = 類名() ;而對(duì)于 call 方法的執(zhí)行是由對(duì)象后加括號(hào)觸發(fā)的,即:對(duì)象() 或者 類()()
class Foo: def __init__(self): pass def __call__(self, *args, **kwargs): print("__call__") obj = Foo() # 執(zhí)行 __init__ obj() # 執(zhí)行 __call____len__
class A: def __init__(self): self.a = 1 self.b = 2 def __len__(self): return len(self.__dict__) a = A() print(len(a))__hash__
class A: def __init__(self): self.a = 1 self.b = 2 def __hash__(self): return hash(str(self.a)+str(self.b)) a = A() print(hash(a))__eq__
class A: def __init__(self): self.a = 1 self.b = 2 def __eq__(self,obj): if self.a == obj.a and self.b == obj.b: return True a = A() b = A() print(a == b)
邏輯題: class Person: def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex def __hash__(self): return hash(self.name+self.sex) def __eq__(self, other): if self.name == other.name and self.sex == other.sex:return True p_lst = [] for i in range(84): p_lst.append(Person("egon",i,"male")) # # print(p_lst) obj = list(set(p_lst))[0] print(obj.name,obj.age,obj.sex)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/41983.html
摘要:如果初學(xué)者接觸的第一門語言是,學(xué)習(xí)曲線則會(huì)平滑得多,掌握一些基本語法和內(nèi)置的數(shù)據(jù)結(jié)構(gòu),已經(jīng)可以上手寫一些小工具或者小型應(yīng)用。如果你的學(xué)習(xí)時(shí)間充足,我的建議是一定要學(xué)數(shù)據(jù)結(jié)構(gòu)和算法。 前言 Python是最容易入門的編程語言,沒有之一。如果初學(xué)者接觸的第一門語言是C或者C++,對(duì)他們來說最難的不是語法,而是容易出現(xiàn)內(nèi)存泄漏、指針等問題。有時(shí)候排查這些問題對(duì)初學(xué)者的打擊很大,尤其是沒掌握排...
摘要:本文是切片系列的第三篇,主要內(nèi)容是迭代器切片。實(shí)際上,迭代器必然是可迭代對(duì)象,但可迭代對(duì)象不一定是迭代器。這是迭代器切片最具想象力的用途場景。考慮到文件對(duì)象天然就是迭代器,我們可以使用迭代器切片先行截取,然后再處理,如此效率將大大地提升。 2018-12-31 更新聲明:切片系列文章本是分三篇寫成,現(xiàn)已合并成一篇。合并后,修正了一些嚴(yán)重的錯(cuò)誤(如自定義序列切片的部分),還對(duì)行文結(jié)構(gòu)與章...
摘要:本文是切片系列的第三篇,主要內(nèi)容是迭代器切片。實(shí)際上,迭代器必然是可迭代對(duì)象,但可迭代對(duì)象不一定是迭代器。這是迭代器切片最具想象力的用途場景??紤]到文件對(duì)象天然就是迭代器,我們可以使用迭代器切片先行截取,然后再處理,如此效率將大大地提升。 2018-12-31 更新聲明:切片系列文章本是分三篇寫成,現(xiàn)已合并成一篇。合并后,修正了一些嚴(yán)重的錯(cuò)誤(如自定義序列切片的部分),還對(duì)行文結(jié)構(gòu)與章...
閱讀 3124·2021-11-24 09:39
閱讀 986·2021-09-07 10:20
閱讀 2406·2021-08-23 09:45
閱讀 2282·2021-08-05 10:00
閱讀 582·2019-08-29 16:36
閱讀 846·2019-08-29 11:12
閱讀 2831·2019-08-26 11:34
閱讀 1848·2019-08-26 10:56