Python 基礎之面向對象之類中的方法和與類相關的魔術屬性以及反射

一.類中的方法

普通方法: 沒有參數,只能類調用
綁定方法: (1)綁定到對象(自動傳遞對象參數) (2)綁定到類(自動傳遞參數)
靜態方法: 不管是類仍是對象,都能調用的方法

#:
class Dog():
    def __init__(self,name):
        self.name = name

    #普通方法
    def jiao():
        print("小狗會叫")

    #綁定到對象方法
    def tian(self):
        print("小狗喜歡舔骨頭")

    #綁定到類方法
    @classmethod
    def chi(cls):
        print(cls)
        print("小狗喜歡吃肉")

    #靜態方法
    @staticmethod
    def jump():
        print("小狗喜歡跳起來接飛盤")

#實例化對象
obj = Dog("小黑")函數

# (1)普通方法

Dog.jiao()
#對象沒法調用,只能用類.方法spa

# (2)綁定到對象方法

obj.tian()

#Dog.tian(123)  #若是硬要使用類來調用,知足實參一一對應(隨機加個值)對象

# (3)綁定到對象方法

Dog.chi()
# 用對象調用綁定到類的方法是能夠的
# 先找出該對象所歸屬的類是誰,而後再傳遞這個類
obj.chi()繼承

# (4)靜態方法

obj.jump()
Dog.jump()文檔

二.與類相關的魔術屬性

#:字符串

class Human():
    pass

class Man():
    pass

class Woman():
    passget


class Children(Man, Woman):
    '''
    類的功能: 描述一個小孩
    類的成員屬性: eye
    類的成員方法: sleep __beat_doudou
    '''
    eye = "藍色的眼睛"
    #普通方法
    def eat():
        print("小孩須要多吃有養分的東西")

    #綁定方法
    def sleep(self):
        print("小孩喜歡睡覺")

    def drink(self):
        print("小孩要常常喝水")

    def cry(self, func):
        res = func.__name__
        print(res, type(res))

    #私有綁定方法
    def __beat_doudou(self):
        print("小孩喜歡打豆豆")

#__dict__ 獲取對象或類的內部成員結構
obj = Children()
res = obj.__dict__
# __dict__ 歸屬是類的.全部用對象是沒有辦法查看類的內部成員結構的
print(res) #因此res爲空
print(Children.__dict__)

# __doc__ 獲取對象或類的內部文檔
res = Children.__doc__
print(res)

'''
輸出結果:
    類的功能: 描述一個小孩
    類的成員屬性: eye
    類的成員方法: sleep __beat_doudou
'''
# __name__ 獲取類名函數名
def myfunc():
    print("我是函數")
obj.cry(myfunc)   # myfunc <class 'str'>
# __class__ 獲取當前對象所屬的類
res = obj.__class__
print(res)  #<class '__main__.Children'>

# __bases__ 獲取一個類直接繼承的全部父類,返回元組
res = Children.__bases__
print(res)input

三.反射

概念:經過字符串去操做類對象 或者 模塊中的屬性方法
(1)類中的反射
hasattr() 檢測對象/類是否有指定的成員
getattr() 獲取對象/類成員的值
setattr() 設置對象/類成員的值
delattr() 刪除對象/類成員的值it

(2)模塊的反射
sys.modules 返回一個系統字典,字典的鍵是加載的全部模塊class

 

 

1.類中的反射

# (1)hasattr() 檢測對象/類是否有指定的成員 [以是否可以自動調用爲基準]
#用的是二中的obj

res = hasattr(obj, "eye")
print(res)

res = hasattr(Children, "eat")
print(res)  # 返回True說明存在

# (2)getattr() 獲取對象/類成員的值
res = getattr(obj, "eye")
print(res)  # 藍色的眼睛

res = getattr(obj, "sleep")
print(res)  # 它返回的是一個綁定方法
res()  # 小孩喜歡睡覺

# 類的方式
res = getattr(Children, "eat")
print(res)
res()  # 小孩須要多吃有養分的東西

res = getattr(Children, "sleep")
print(res)  # 它不是一個綁定方法,全部必定須要用類的方式
res(1)

#(3)getattr 第三個參數可選若是獲取不到這個值,能夠添加默認提示,預防報錯
res = getattr(obj, "abc", "對不起這個真沒有")
print(res)

# strvar = input("請輸入您要調用的函數:")
# if hasattr(obj,strvar):
# res = getattr(obj,strvar)
# res()

# (3)setattr() 設置對象/類成員的值
setattr(obj, "hair", "黑色")
print(obj.hair)
setattr(Children, "skin", "綠色")
print(Children.skin)

# (4)delattr() 刪除對象/類成員的值
delattr(obj, "hair")
# print(obj.hair)

delattr(Children, "skin")
# print(Children.skin)

2.模塊的反射

#sys.modules 返回一個系統字典,字典的鍵是加載的全部模塊

#3:import sysres = sys.modulesprint(res)print(__name__) # __main__ 是不是主文件運行mymodule = sys.modules[__name__]print(mymodule)  #打印主模塊def func1():    print("這是func1方法")def func2():    print("這是func2方法")def func3():    print("這是func3方法")# 用戶給我字符串,我反射對應的方法調用while True:    strvar = input("請輸入您要調用的方法:")    if hasattr(mymodule, strvar):        _func_ = getattr(mymodule, strvar)        _func_()        # 注意這個函數會繼承您輸入的函數,        # 全部若是輸入_myfunc會打印上一個函數的內容,全部這個函數名取得特殊一點    else:        print("大哥,沒有")

相關文章
相關標籤/搜索