物件導向相關

Bound_w發表於2018-08-30

特殊成員補充:

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))方法

 

相關文章