一.特殊方法補充
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中
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中
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 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)
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)
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)
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)
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)
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)
三. 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)
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)
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是方法
總結:
用類調用的就是函數,用對象調用的就是方法
五.反射就是利用字符串形式的對象(模塊)中操做(尋找/檢查/刪除/設置)成員。
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