Python OOP-5

12. 所用軟件

  • 畫圖軟件:Faststone capture

13. 抽象類

  • 抽象方法:沒有具體實現(xiàn)內(nèi)容的方法稱為抽象方法

  • 抽象方法的主要意義是規(guī)范了子類的行為和接口

  • 抽象的使用需要借助abc模塊

      import abc
    
  • 抽象類:包含抽象方法的類叫做抽象類闽寡,通常成為ABC類

  • 抽象類的使用

    • 抽象類可以包含抽象方法尼酿,也可以包含具體方法
    • 抽象類中可以有方法也可以有屬性
    • 抽象類不允許直接實例化
    • 必須繼承才可以使用,且繼承的子類必須實現(xiàn)所有繼承來的抽象方法
    • 假定子類沒有實現(xiàn)所有繼承的抽象方法涎永,子類也不能實例化
    • 抽象類的主要作用是設(shè)定類的標(biāo)準(zhǔn)羡微,以便于開發(fā)的時候具有統(tǒng)一的規(guī)范

14. 自定義類

  • 類其實是一個類定義和各種方法的自由組合
  • 可以定義類和函數(shù)妈倔,然后自己通過類來直接賦值
  • 可以借助于MethodType實現(xiàn)
  • 借助于type實現(xiàn)
  • 利用元類實現(xiàn)- MetaClass
    • 元類是類
    • 被用來創(chuàng)造別的類
# 變量的三種用法

class A():
    def __init__(self):
        self.name = "haha"
        self.age = 18
        
a = A()
# 屬性的三種用法
# 1. 賦值
# 2. 讀取
# 3. 刪除
a.name = "ruochen"
print(a.name)
del a.name
# print(a.name)
ruochen
# 類屬性 property
# 應(yīng)用場景:
# 對變量除了普通的三種操作启涯,還想增加一些附加的操作,那么可以通過property完成
class A():
    def __init__(self):
        self.name = "haha"
        self.age = 18
    # 此功能黎做,是對類變量讀取操作的時候應(yīng)該執(zhí)行的函數(shù)功能
    def fget(self):
        print("我被讀取了")
        return self.name
    # 模擬的是對變量進(jìn)行寫操作的時候執(zhí)行的功能
    def fset(self, name):
        print("我被寫入了蒸殿,但是還可以做好多事情")
        self.name = name + "1"
     # fdel模擬的是刪除變量的時候進(jìn)行的操作   
    def fdel(self):
        pass
    
    # property的四個參數(shù)順序的固定的
    # 第一個參數(shù)代表讀取的時候需要調(diào)用的函數(shù)
    # 第二個參數(shù)代表寫入的時候需要調(diào)用的函數(shù)
    # 第三個是刪除
    name2 = property(fget, fset, fdel, "這是一個property的例子")
    
a = A()
print(a.name)

print(a.name2)
haha
我被讀取了
haha
# 抽象

class Animel():
    
    def sayHello(self):
        pass
    
class Dog(Animel):
    
    def sayHello(self):
        print("問一下對方")

class Person(Animel):
    
    def sayHello(self):
        print("Kiss me")
        
d = Dog()
d.sayHello()

p = Person()
p.sayHello()
問一下對方
Kiss me
# 抽象類的實現(xiàn)

import abc

# 聲明一個類并且指定當(dāng)前類的元類
class Hunam(metaclass=abc.ABCMeta):
    
    # 定義一個抽象的方法
    @abc.abstractmethod
    def smoking(self):
        pass
    
    # 定義類抽象方法
    @abc.abstractclassmethod
    def drink():
        pass
    
    # 定義靜態(tài)抽象方法
    @abc.abstractstaticmethod
    def play():
        pass
    
    def sleep(self):
        print("Sleeping......")
# 函數(shù)名可以當(dāng)變量使用

def sayHello(name):
    print("{}你好".format(name))

sayHello("A")

liumang = sayHello

liumang("A")
A你好
A你好
# 自己組裝一個類

class A():
    pass

def say(self):
    print("Saying... ...")
    
class B():
    def say(self):
        print("Saying... ...")
        
say(9)

A.say = say

a = A()
a.say()

b = B()
b.say()
Saying... ...
Saying... ...
Saying... ...
# 組裝類例子 2
# 自己組裝一個類
from types import MethodType
class A():
    pass

def say(self):
    print("Saying... ...")
    
a = A()
a.say = MethodType(say, A)
a.say()
Saying... ...
help(MethodType)
Help on class method in module builtins:

class method(object)
 |  method(function, instance)
 |  
 |  Create a bound instance method object.
 |  
 |  Methods defined here:
 |  
 |  __call__(self, /, *args, **kwargs)
 |      Call self as a function.
 |  
 |  __delattr__(self, name, /)
 |      Implement delattr(self, name).
 |  
 |  __eq__(self, value, /)
 |      Return self==value.
 |  
 |  __ge__(self, value, /)
 |      Return self>=value.
 |  
 |  __get__(self, instance, owner, /)
 |      Return an attribute of instance, which is of type owner.
 |  
 |  __getattribute__(self, name, /)
 |      Return getattr(self, name).
 |  
 |  __gt__(self, value, /)
 |      Return self>value.
 |  
 |  __hash__(self, /)
 |      Return hash(self).
 |  
 |  __le__(self, value, /)
 |      Return self<=value.
 |  
 |  __lt__(self, value, /)
 |      Return self<value.
 |  
 |  __ne__(self, value, /)
 |      Return self!=value.
 |  
 |  __reduce__(...)
 |      Helper for pickle.
 |  
 |  __repr__(self, /)
 |      Return repr(self).
 |  
 |  __setattr__(self, name, value, /)
 |      Implement setattr(self, name, value).
 |  
 |  ----------------------------------------------------------------------
 |  Static methods defined here:
 |  
 |  __new__(*args, **kwargs) from builtins.type
 |      Create and return a new object.  See help(type) for accurate signature.
 |  
 |  ----------------------------------------------------------------------
 |  Data descriptors defined here:
 |  
 |  __func__
 |      the function (or other callable) implementing a method
 |  
 |  __self__
 |      the instance to which a method is bound
type(8)
int
# 利用type造一個類

# 先定義類應(yīng)該具有的成員函數(shù)
def say(self):
    print("Saying... ...")
    
def talk(self):
    print("Talking... ...")
    
# 利用type來創(chuàng)建一個類
A = type("AName", (object, ), {"class_say":say, "class_talk":talk})

# 然后可以像正常一樣使用類
a = A()
dir(a)
a.class_say()
Saying... ...
# 元類演示

# 元類寫法是固定的爬骤,他必須繼承于type
# 元類一般命名以MetaClass結(jié)尾
class CMetaClass(type):
    # 注意以下寫法
    def __new__(cls, name, bases, attrs):
        # 自己的業(yè)務(wù)處理
        print("我是元類")
        attrs['id'] = '000000'
        attrs['addr'] = "1"
        return type.__new__(cls, name, bases, attrs)
    
# 元類定義完就可以使用霞玄,使用注意寫法
class Teacher(object, metaclass=CMetaClass):
    pass

t = Teacher()

t.__dict__
t.id
我是元類





'000000'
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末坷剧,一起剝皮案震驚了整個濱河市惫企,隨后出現(xiàn)的幾起案子狞尔,更是在濱河造成了極大的恐慌巩掺,老刑警劉巖锌半,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異殉摔,居然都是意外死亡逸月,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門瓤湘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弛说,“玉大人木人,你說我怎么就攤上這事冀偶〗” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長搀罢。 經(jīng)常有香客問我侥猩,道長欺劳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任枫弟,我火速辦了婚禮鹏往,結(jié)果婚禮上淡诗,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好韩容,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布款违。 她就那樣靜靜地躺著,像睡著了一般群凶。 火紅的嫁衣襯著肌膚如雪插爹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天请梢,我揣著相機(jī)與錄音赠尾,去河邊找鬼。 笑死毅弧,一個胖子當(dāng)著我的面吹牛气嫁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播杉编,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蛾坯,長吁一口氣:“原來是場噩夢啊……” “哼救军!你這毒婦竟也來了唱遭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后庭再,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缝彬,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡一疯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年眉睹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖甩卓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鹿寻,我是刑警寧澤坦敌,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布财搁,位于F島的核電站,受9級特大地震影響提茁,放射性物質(zhì)發(fā)生泄漏汪疮。R本人自食惡果不足惜卖丸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一粹湃、第九天 我趴在偏房一處隱蔽的房頂上張望腕让。 院中可真熱鬧偏形,春花似錦、人聲如沸萨惑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽磕道。三九已至疯特,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工旺遮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鸣剪,地道東北人拥褂。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓茄螃,卻偏偏與公主長得像拼弃,于是被迫代替她去往敵國和親盯孙。 傳聞我的和親對象是個殘疾皇子报账,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容