特殊方法補充以及反射

一.特殊方法補充
1.__str__  使打印對象名時獲得的再也不是一個內存地址<__main__.Foo object at 0x000001B815568E10>
而是return 後面的字符串
1 class Foo: 2 
3     def __init__(self,name,age): 4         self.name=name 5         self.age=age 6     def __str__(self): 7         return '這個函數的名字或介紹等等'  #此處也能夠返回一個obj2,須要鑑別
8 obj1=Foo('lisa',18) 9 print(obj1,type(obj1))  #這個函數的名字或介紹等等 <class '__main__.Foo'>
2.__doc__ 打印類的註釋(不用在類中添加___doc__函數就能夠)
 1 class Foo:  2     '''
 3  這個類是作什麼的  4     '''
 5     def __init__(self,name,age):  6         self.name=name  7         self.age=age  8 
 9     def __str__(self): 10         return '這個函數的名字或介紹等等'  #此處也能夠返回一個obj2,須要鑑別
11 
12 obj1=Foo('lisa',18) 13 print(obj1.__doc__)  #這個類是作什麼的
3.__dict__  直接打印對象.__dict__  將對象中封裝的全部的值以字典的方式呈現
 1 class Foo:  2 
 3     def __init__(self,name,age):  4         self.name=name  5         self.age=age  6 
 7     def __str__(self):  8         return '這個函數的名字或介紹等等'
 9 obj1=Foo('lisa',11) 10 obj2=Foo('sushan',12) 11 
12 print(obj1.__dict__)   #{'name': 'lisa', 'age': 11}
13 print(obj2.__dict__)    #{'name': 'sushan', 'age': 12}
4.__iter__  把不可迭代對象轉換成可迭代對象,有如下兩種方法
 1 l1=[11,22,33,44]  2 l2=[1,2,3,4]  3 
 4 class Foo:  5 
 6     def __init__(self,name,age):  7         self.name=name  8         self.age=age  9 
10     def func(self): 11         pass
12 
13     # def __iter__(self):
14     # return iter([1,22,33,44,55,6]) #返回的是一個迭代器
15 
16     def __iter__(self): 17         yield 1
18         yield 2
19         yield 3
20         yield 4
21 
22 obj=Foo('as',1) 23 for item in obj: 24     print(item)
二.類變量與實例變量的區別:
 1 class Foo:  2     country='中國哦'
 3     def __init__(self,name,age):  4         self.name=name  5         self.age=age  6     def func(self):  7         Foo.country='美國'
 8         print(Foo.country)  9     def func1(self): 10         print(Foo.country) 11 obj=Foo('kl','jhh') 12 obj.func() 13 obj.func1()  #此時的func1裏打印的也是美國,
14              說明類變量中的country是公共的在func中的修改也會延續到func1中
2.1.1
 1 class Foo:  2     country='中國哦'
 3     def __init__(self,name,age):  4         self.name=name  5         self.age=age  6     def func(self):  7         self.name='胡歌'
 8         print(self.name)  9     def func1(self): 10         print(self.name) 11 obj=Foo('彭于晏',34) 12 obj.func() 13 obj.func1()   #此時的func1裏打印的也是胡歌
14              # 說明實例變量中的self.name是在一個對象中公共的在func中的修改也會延續到func1中
2.1.2
 1 class Foo:  2     country='中國哦'
 3     def __init__(self,name,age):  4         self.name=name  5         self.age=age  6     def func1(self):  7         print(Foo.country)  8     def func(self):  9         Foo.country = '美國'
10         print(Foo.country) 11 
12 
13 obj1=Foo('Lisa',18) 14 obj2=Foo('linda',20) 15 
16 obj1.func1() 17 obj1.func() 18 
19 obj2.func1() 20 obj2.func()
類變量在各個對象中是公有的
 1 class Foo:  2     country='中國哦'
 3     def __init__(self,name,age):  4         self.name=name  5         self.age=age  6 
 7     def func1(self):  8         print(self.name)  9 
10     def func(self): 11         self.name='sushan'
12         print(self.name) 13 
14 
15 obj1=Foo('Lisa',18) 16 obj2=Foo('linda',20) 17 
18 obj1.func1() 19 obj1.func() 20 
21 obj2.func1() 22 obj2.func()
每個對象都一份構造方法封裝的實例變量

2.2 練習題app

 1 class StarkConfig:  2     list_display=[]  3 
 4     def get_list_display(self):  5         self.list_display.insert(0,33)  6         return self.list_display  7 
 8 class RoleConfig:  9     list_display=[11,22] 10 
11 s1=StarkConfig() 12 ret1=s1.get_list_display() 13 print(ret1) 14 
15 ret2=s1.get_list_display() 16 print(ret2)
習題1
 1 class StarkConfig:  2     def __init__(self):  3         self.list_display=[]  4 
 5     def get_list_display(self):  6         self.list_display.insert(0,33)  7         return self.list_display  8 
 9 class RoleConfig: 10     list_display=[11,22] 11 
12 s1=StarkConfig() 13 ret1=s1.get_list_display() 14 print(ret1) 15 
16 ret2=s1.get_list_display() 17 print(ret2)
習題2
 1 class StarkConfig:  2     def __init__(self):  3         self.list_display=[]  4 
 5     def get_list_display(self):  6         self.list_display.insert(0,33)  7         return self.list_display  8 
 9 class RoleConfig(StarkConfig): 10     list_display=[11,22] 11 
12 s1=StarkConfig() 13 s2=StarkConfig() 14 ret1=s1.get_list_display() 15 print(ret1) 16 
17 ret2=s2.get_list_display() 18 print(ret2)
習題3
 1 class StarkConfig:  2 
 3     list_display=[]  4 
 5     def get_list_display(self):  6         self.list_display.insert(0,33)  7         return self.list_display  8 
 9 class RoleConfig(StarkConfig): 10     list_display=[11,22] 11 
12 s1=StarkConfig() 13 s2=StarkConfig() 14 ret1=s1.get_list_display() 15 print(ret1) 16 
17 ret2=s2.get_list_display() 18 print(ret2)
習題4
 1 class StarkConfig:  2 
 3     list_display=[]  4 
 5     def get_list_display(self):  6         self.list_display.insert(0,33)  7         return self.list_display  8 
 9 class RoleConfig(StarkConfig): 10     list_display=[11,22] 11 
12 s1=StarkConfig() 13 s2=StarkConfig() 14 ret1=s1.get_list_display() 15 print(ret1) 16 
17 ret2=s2.get_list_display() 18 print(ret2)
習題5
 1 class StarkConfig:  2 
 3     list_display=[]  4 
 5     def get_list_display(self):  6         self.list_display.insert(0,33)  7         return self.list_display  8 
 9 class RoleConfig(StarkConfig): 10     list_display=[11,22] 11 
12 s1=StarkConfig() 13 s2=RoleConfig() 14 ret1=s1.get_list_display() 15 print(ret1) 16 
17 ret2=s2.get_list_display() 18 print(ret2)
習題6
 1 class StarkConfig:  2 
 3     list_display=[]  4 
 5     def get_list_display(self):  6         self.list_display.insert(0,33)  7         return self.list_display  8 
 9 class RoleConfig(StarkConfig): 10     list_display=[11,22] 11 
12 s1=RoleConfig() 13 s2=RoleConfig() 14 ret1=s1.get_list_display() 15 print(ret1) 16 
17 ret2=s2.get_list_display() 18 print(ret2)
習題7
三. isinstance/issubclass/type
3.1 issubclass(翻譯爲是否是子集)檢查第一個參數是否爲第二個參數的子子孫孫
 1 class Base:  2     pass
 3 
 4 class Foo(Base):  5     pass
 6 
 7 class Bar(Foo):  8     pass
 9 
10 print(issubclass(Bar,Base))  #True 檢查第一個參數是否爲第二個參數的子子孫孫
3.2type  #判斷當前對象是由哪一個類建立的
1 class Foo: 2 # pass
3 # obj=Foo()
4 # print(type(obj)) #<class '__main__.Foo'>
1 class Foo: 2     pass
3 obj=Foo() 4 print(obj) 5 if type(obj)==Foo: 6     print('obj對象是Foo類建立的') 7 else: 8     print('錯誤')  #obj對象是Foo類建立的
例子
 1 class Foo:  2     pass
 3 
 4 class Bar:  5     pass
 6 
 7 def func(*args):  8     Foo_num=0  9     Bar_num=0 10     for item  in args: 11         if type(item)==Foo: 12             Foo_num+=1
13         elif type(item)==Bar: 14             Bar_num+=1
15         else: 16             print('輸入有誤!') 17     return (Foo_num,Bar_num) 18 ret=func(Foo(),Foo(),Bar()) 19 print(ret)  #(2, 1)
判斷Foo類建立了幾個對象,Bar類建立了幾個對象
3.3isinstance  #檢查第一個參數(對象)是不是第二個參數(類及父類)的實例
1 class Base: 2     pass
3 class Foo(Base): 4     pass
5 
6 obj=Foo() 7 print(isinstance(obj,Base))
四.方法仍是函數
4.1用科學的方法判斷是函數仍是方法
 1 from types import MethodType,FunctionType  2 def check(arg):  3     '''
 4  檢查arg是方法仍是函數  5  :param arg:  6  :return:  7     '''
 8     if isinstance(arg,MethodType):  9         print('是一個方法') 10     elif isinstance(arg,FunctionType): 11         print('是一個函數') 12 
13 def func(): 14     pass
15 class Foo: 16     def __init__(self,name): 17         self.name=name 18 
19     def func1(self): 20         print(self.name) 21 
22  @staticmethod 23     def func2(): 24         pass
25 
26 check(func) 27 obj=Foo('haha') 28 
29 check(obj.func1) 30 check(obj.func2)
View Code
1 class Foo: 2     def f1(self): 3         pass
4     def f2(self): 5         pass
6 obj=Foo() 7 obj.f1()  #把f1當成一個方法,self自動傳值
8 Foo.f1(obj)   # 把f1當成一個函數,手動傳值
 1 class Foo:  2     def f1(self):  3         pass
 4     def f2(self):  5         pass
 6     def f3(self):  7         pass
 8     list_display=[f1,f2]  9 obj=Foo() 10 Foo.list_display.append(obj.f3) 11 for item in Foo.list_display: 12     print(item)  #f1和f2是函數,f3是方法
View Code
總結:
用類調用的就是函數,用對象調用的就是方法
五.反射就是利用字符串形式的對象(模塊)中操做(尋找/檢查/刪除/設置)成員。
 1 import handler  2 handler.f1()  3 while True:  4     print('''
 5  系統支持的函數有:  6  1.f1  7  2.f2  8  3.f3  9  4.f4 10  5.f5 11     ''') 12     val=input('請輸入要執行的函數') 13     if val=='f1': 14  handler.f1() 15     if val=='f2': 16  handler.f2() 17     if val=='f3': 18  handler.f3() 19     if val=='f4': 20  handler.f4() 21     if val=='f5': 22         handler.f5()
之前
 1 import handler  2 handler.f1()  3 while True:  4     print('''
 5  系統支持的函數有:  6  1.f1  7  2.f2  8  3.f3  9  4.f4 10  5.f5 11     ''') 12     val = input('請輸入要執行的函數') 13     if hasattr(handler,val):   #判斷可否找到
14         func=getattr(handler,val)  #getattr('從哪裏','找什麼') 獲取屬性,根據字符串爲參數,從模塊中找到與之同名的成員
15  func() 16     else: 17         print('不存在')
反射實例(用模塊作)
 1 class Foo:  2     country='中國'
 3     def func(self):  4         print('func')  5 
 6 print(getattr(Foo,'country'))  7 
 8 v=getattr(Foo,'func')  9 v(Foo)   #根據字符串爲參數,類中找到與之同名的成員
10 
11 obj=Foo() 12 v=getattr(obj,'func')()  #根據字符串爲參數,從對象中找到與之同名的成員
總結:
由於一切皆對象,因此根據字符串爲參數(第二個參數),從對象(第一個參數)中找到與之同名的成員
 1 class Foo:  2     def login(self):  3         print('d')  4 
 5     def logout(self):  6         print('z')  7 
 8     def register(self):  9         print('zc') 10 
11     def run(self): 12         choice_list =['login','logout','register'] 13         print('''
14  '請輸入要執行的功能: 15  1:登陸 16  2.註銷 17  3.註冊 18         ''') 19         choice=int(input('請輸入你的選擇:')) 20         func=getattr(self,choice_list[choice-1]) 21  func() 22 obj=Foo() 23 obj.run()
反射實例
反射的補充:(若是有特別多的判斷時能夠用)
getattr #根據字符串的形式,去對象中找成員
hasattr #根據字符串的形式,去對象中判斷是否有成員
setattr #根據字符串的形式,動態設置一個成員(內存)
delattr ##根據字符串的形式,動態刪除一個成員(內存)
 1 import xx  2 v1=getattr(xx,'x1')  3 v2=getattr(xx,'f1')  4 v2('水火不容')  5 
 6 v3=hasattr(xx,'x1')  7 print(v3)  8 v4=hasattr(xx,'f1')  9 print(v4) 10 print(hasattr(xx,'dgdfb1')) 11 
12 
13 setattr(xx,'x2',999) 14 print(getattr(xx,'x2')) 15 
16 setattr(xx,'f2',lambda x:x-1) 17 print(getattr(xx,'f2')) 18 
19 delattr(xx,'x2') 20 print(getattr(xx,'x2'))
在模塊中的應用
 1 class Foo:  2     def __init__(self,a1):  3         self.a1=a1  4         self.a2=None  5 obj=Foo(1)  6 
 7 v=getattr(obj,'a1')  8 print(v)  9 
10 setattr(obj,'a2',2) #不建議用,若是要用上面要寫self.a2=None,以便他人理解
在對象中的應用
六.什麼後面能夠加括號(判斷一個東西是否能夠被調用)
  類
  函數
  對象
  方法
calable判斷一個東西是否能夠被調用
 1 def func():  2     pass
 3 class Foo:  4     def __call__(self):  5         pass
 6     def func(self):  7         pass
 8     pass
 9 obj=Foo() 10 print(callable(func))  #True
11 print(callable(Foo))  #True
12 print(callable(obj))  #False 方法中加上__call__纔會可調用
13 print(callable(obj.func))   #True
相關文章
相關標籤/搜索