1. 程式人生 > >面向物件再進階

面向物件再進階

  • 封裝在繼承中的情況
  • 反射
  • 裝飾器
'''子類不能繼承父類的私有方法'''
'''
class Son(object):
    A=123
    __AB=234
    # print(__AB) # 只能在內部檢視,內部會自動翻譯成 '_Son__AB': 234, 也就是_類名__AB
# print(Son.__AB)  # 報錯 私有屬性不能在外部檢視

# print(Son.__dict__) # 檢視所有靜態屬性


class Foo(Son):
    def func(self):
        print(Foo.A) # 子類沒有找父類 所以列印結果為 
123 # print(Son.__AB) 當前類(就是你在誰那就會變成誰的)會自動幫你翻譯成_Foo__AB會自動加上類名,這樣的東西在父類中是沒有的,所以他會報錯. print(Foo().func()) # __這個變量出現在哪個類中,就會在變形的時候 加上這個類的類名 # 所以在子類中使用私有的名字,會加上子類的名字 # 這樣就不可能呼叫加上了父類名字的靜態變量了''' # class Foo(object): # def __init__(self): # self.__func() # 此時翻譯為_Foo__func # def __func(self): # print(
'你好') # 所以列印的是這個 # def func(self): # print('你不好') # class Son(Foo): # def __func(self): # print('不好') # def func(self): # print('') # Son() # print(Foo.__dict__) ''' 呼叫私有的方法或者屬性 不需要考慮self是誰的物件 只要是私有的方法或者屬性,就一定是在呼叫的當前類中執行方法 當某個方法或者屬性,不希望被子類繼承的時候,也可以把這個方法\屬性定義為私有成員
''' # 二 類中的幾個裝飾器函式 # class A: # __count=0 # def __init__(self,name): # self.name=name # self.__add_count() # # def __add_count(self): # 常規寫法,但是寫完之後你會發現,這個作用根本就用不到self,也就沒有物件什麼事(不需要這個self引數) # # A.__count+=1 # @classmethod # 類方法 # def __add_count(cls): # 順便說 定義一個私有方法,目的是讓這個方法在類的內部使用 # cls.__count+=1 # 相當於類名點方法了 # @classmethod # def show_count(cls): # return cls.__count # 讓使用者從外部檢視__count的值 # # print(A(33).show_count()) #物件操作方法 # print(A.show_count()) # 類名直接操作方法 ''' # 在類中會有一種情況,就是這個方法並不需要使用某一個物件的屬性 # 因此這個方法中的self完全是一個沒用的引數 # show_count是一個檢視類中屬性的方法,這樣的方法和某一個物件並沒有直接聯絡 # 本質上,一個方法不使用物件屬性,但使用靜態屬性---就是類方法@classmothd # 呼叫這個方法,可以使用物件呼叫,也可以是用類呼叫 # 但是這個方法的預設引數永遠是當前類的名稱空間,而不是物件的 ''' # (2) # 如果一個類中的方法不用物件屬性也不用靜態屬性__就是靜態方法@staticmethod # 那實際上這個方法就是一個普通的函式 # 那綜上所述大體總結: ''' 普通方法 類方法 靜態方法 預設引數 self cls 無 操作的變數 操作物件的屬性 操作靜態屬性 既不操作物件屬性,也不操作類屬性 所屬的名稱空間 類 類 類 呼叫方式 物件呼叫 類或物件 類/物件 對應的裝飾器 無 @ classmethod @staticmethod ''' # 三 反射 # 什麼意思呢 :你希望能夠通過這個字串-->程式中的變數名(類名\函式\變數名\方法名\物件名) # 例如: # class Person: # role = '人類' # Country = '中國' # # attr = input('>>>') # role 人類 # # Country 中國 # print(getattr(Person,'role')) # print(getattr(Person,'Country')) # if hasattr(Person,attr): # print(getattr(Person,attr)) # 把你所獲取到的字串變成程式碼 # 所有 的a點b都可以被反射成getattr(a,"b") # 反射中的方法 class Person(): role='人類' @staticmethod def show_courses(): print('所偶有課成') # Person.role==getattr(Person,'role') # 這句僅僅是判斷他是不是等於他 # print(Person.role) print(getattr(Person,'role')) # Person.show_courses() == getattr(Person,'show_courses')() ret = getattr(Person,'show_courses') ret() # 如果是方法就返回方法 呼叫的時候加括號