特殊成員補充:
1.__str__
2.__doc__:檢視""" """所註釋的內容
3.__dict__:把所傳的值以字典的形式列印出來
class Foo(object): def __init__(self, name, age): self.name = name self.age = age def func(self): pass obj1 = Foo('劉博文', 99) obj2 = Foo('史雷', 89) print(obj1.__dict__) # {'name': '劉博文', 'age': 99} print(obj2.__dict__) # {'name': '史雷', 'age': 89}
4.__iter__ 把不可迭代物件 -> 可迭代物件
class Foo(object):
def __iter__(self):
return iter([123,456])
obj=Foo()
for el in obj:
print(el )
練習題:
一.
class Starkconfig(object): list_display=[] def get_list_display(self): self.list_display.insert(0,999) return self.list_display class Roleconfig(Starkconfig): list_display = [11,22] s1=Starkconfig() ret=s1.get_list_display() print(ret) ret2=s1.get_list_display() print(ret2) [999] [999, 999]
二.
class StarkConfig(object):
list_display = []
def get_list_display(self):
self.list_display.insert(0,33)
return self.list_display
class RoleConfig(StarkConfig):
list_display = [11,22]
s1 = StarkConfig()
s2 = StarkConfig()
result1 = s1.get_list_display()
print(result1)
result2 = s2.get_list_display()
print(result2)
[33]
[33,33]
三.
class StarkConfig(object):
list_display = []
def get_list_display(self):
self.list_display.insert(0,33)
return self.list_display
class RoleConfig(StarkConfig):
list_display = [11,22]
s1 = StarkConfig()
s2 = RoleConfig()
result1 = s1.get_list_display()
print(result1)
result2 = s2.get_list_display()
print(result2)
[33]
[33, 11, 22]
四.
class StarkConfig(object):
list_display = []
def get_list_display(self):
self.list_display.insert(0,33)
return self.list_display
class RoleConfig(StarkConfig):
list_display = [11,22]
s1 = RoleConfig()
s2 = RoleConfig()
result1 = s1.get_list_display()
print(result1)
result2 = s2.get_list_display()
print(result2)
[33, 11, 22]
[33, 33, 11, 22]
#########################################################################
1.issubclass type isinstance:
<1.issubclass :檢查第一個引數(子類)是否是第二個引數(父類)的 子子孫孫類
class a: pass class b(a): pass class c(b): pass print(issubclass(b,a)) print(issubclass(c,b)) print(issubclass(c,a))**** True True True
<2.type :獲取當前的物件是由那個類建立的
class Foo(object): pass class Bar(object): pass def func(*args): foo_conter=0 bar_conter=0 for el in args: if type(el)==Foo: foo_conter+=1 elif type(el )==Bar: bar_conter+=1 return foo_conter,bar_conter ret1,ret2=func(Foo(),Foo(),Bar()) print(ret1,ret2) 2 1
<3.isinstance :檢查第一個引數(物件)是否是第二個引數(以及父類)的例項、
class Foo(Base): pass obj1 = Foo() print(isinstance(obj1,Foo)) # 檢查第一個引數(物件)是否是第二個引數(類及父類)的例項。 print(isinstance(obj1,Base)) # 檢查第一個引數(物件)是否是第二個引數(類及父類)的例項。 obj2 = Base() print(isinstance(obj2,Foo)) # 檢查第一個引數(物件)是否是第二個引數(類及父類)的例項。 print(isinstance(obj2,Base)) # 檢查第一個引數(物件)是否是第二個引數(類及父類)的例項。 True True False True
練習:給你一個引數,判斷物件是不是由某一個指定類? type --> type(obj) == Foo
給你一個引數,判斷物件是不是由某一個指定類或其父類? isinstance
方法和函式:
物件.xxx --> xxx就是方法
類.xxx --> xxx就是函式
xxx --> xxx就是函式
列印檢視:
function 功能
method 方法
程式碼檢查:
from types import MethodType,FunctionType
def check(arg):
"""
檢查arg是方法還是函式?
:param arg:
:return:
"""
if isinstance(arg,MethodType):
print('arg是一個方法')
elif isinstance(arg,FunctionType):
print('arg是一個函式')
else:
print('不知道是什麼')
反射*****
可以在模組中使用,也可以在物件導向中使用
模組:
from types import FunctionType import handler while True: print(""" 系統支援的函式有: 1. f1 2. f2 3. f3 4. f4 5. f5 """) val = input("請輸入要執行的函式:") # val = "f1" if hasattr(handler, val):#檢查handler中是否有val的值 hasattr func_or_val = getattr(handler, val) # 根據字串為引數,去模組中尋找與之同名的成員。***** if isinstance(func_or_val, FunctionType):#判斷func_or_val是不是以一個方法 func_or_val() else: print(func_or_val) else: print('handler中不存在輸入的屬性名')
物件導向:
class Account(object):
func_list = ['login', 'logout', 'register']
def login(self):
"""
登入
:return:
"""
print('登入111')
def logout(self):
"""
登出
:return:
"""
print('登出111')
def register(self):
"""
註冊
:return:
"""
print('註冊111')
def run(self):
"""
主程式碼
:return:
"""
print("""
請輸入要執行的功能:
1. 登入
2. 登出
3. 註冊
""")
choice = int(input('請輸入要執行的序號:'))
func_name = Account.func_list[choice-1]
# func = getattr(Account,func_name) # Account.login
# func(self)
func = getattr(self, func_name) # self.login
func()
obj1 = Account()
obj1.run()
總結:
getattr # 根據字串的形式,去物件中找成員。
hasattr # 根據字串的形式,去判斷物件中是否有成員。
setattr # 根據字串的形式,去判斷物件動態的設定一個成員(記憶體)
delattr # 根據字串的形式,去判斷物件動態的設定一個成員(記憶體)
是否可以被呼叫:
類()
物件()
函式()
方法()
def func(): pass class Foo(object): def __call__(self, *args, **kwargs): pass def func(self): pass obj = Foo() print(callable(func))函式 print(callable(Foo))類 print(callable(obj))物件 print(callable(obj.func))方法