目錄
一、類(lèi)的構(gòu)建與繼承
二、多繼承
三、鉆石繼承
四、多態(tài)
五、鴨子類(lèi)型
六、類(lèi)的組合
七、類(lèi)的私有屬性和方法
八、魔法方法
九、單例模式
一、類(lèi)的構(gòu)建與繼承
類(lèi)的屬性包含成員變量和成員函數(shù)(方法)
成員函數(shù)又分為靜態(tài)方法、魔法方法、普通成員方法
靜態(tài)方法可以直接被類(lèi)調(diào)用,也可以被類(lèi)對(duì)象調(diào)用
魔法方法是類(lèi)的默認(rèn)方法,我們可以自定義魔法方法
子類(lèi)繼承父類(lèi),可以對(duì)相同函數(shù)名的函數(shù)進(jìn)行重寫(xiě)
class Person: # Person(object)
name = '沒(méi)有名字'
age = '未出生'
sex = '不知道' # 靜態(tài)屬性
@staticmethod # 靜態(tài)方法
def print_name():
print(f'{Person.name}')
# 實(shí)例屬性方法(魔法方法)
def __init__(self, name='無(wú)名氏', age=0, sex='未知'): # 初始化無(wú)返回值
self.name = name
self.age = age
self.sex = sex
def printName(self):
print(f'我的名字是: {self.name}')
def printAge(self):
print(f'我的年齡是: {self.age}')
def printSex(self):
print(f'我的性別是: {self.sex}')
# 繼承與Person的子類(lèi)
class Son(Person):
def printName(self): # 局部重寫(xiě)
print(f'我有自己的名字, 叫做{self.name}:')
def __init__(self, name='子女', age=1): # 局部繼承
Person.__init__(self)
self.name = name
self.age = age
Person.print_name() # 類(lèi)直接調(diào)用靜態(tài)方法
girl_friend = Person()
girl_friend.print_name() # 類(lèi)對(duì)象調(diào)用靜態(tài)方法
print(girl_friend.name)
girl_friend.printName()
girl_friend.printAge()
girl_friend.printSex()
friend = Person('蘇銘', 21, '男')
friend.print_name()
print(friend.name)
friend.printName()
friend.printAge()
friend.printSex()
print(Son.name)
me = Son()
me.printName()
me.printAge()
me.printSex()
二、多繼承
一個(gè)子類(lèi)可以繼承于多個(gè)父類(lèi),誰(shuí)排前面誰(shuí)優(yōu)先繼承,重名方法的繼承需要考慮優(yōu)先級(jí),不重名方法的繼承不需要考慮優(yōu)先級(jí)(都繼承)。
class Master:
def __init__(self):
self.kongfu = '傳統(tǒng)奶茶配方'
def make_cake(self):
print(f'[傳統(tǒng)] 按照{(diào)self.kongfu}制作了一杯奶茶...')
def smoke(self):
print('抽個(gè)煙')
class School:
def __init__(self):
self.kongfu = '現(xiàn)代奶茶配方'
def make_cake(self):
print(f'[現(xiàn)代] 按照{(diào)self.kongfu}制作了一杯奶茶...')
def drink(self):
print('躲在廁所里喝酒')
# 多繼承
class Prentice(Master, School): # 誰(shuí)排前面,誰(shuí)優(yōu)先繼承
pass
# 子類(lèi)的魔法屬性__mro__決定了屬性和方法的優(yōu)先級(jí)
print(Prentice.__mro__)
me = Prentice()
print(me.kongfu)
me.make_cake()
me.smoke()
me.drink() # 不重名的不考慮順序問(wèn)題
三、鉆石繼承
如果子類(lèi)繼承自兩個(gè)單獨(dú)的超類(lèi),而那兩個(gè)超類(lèi)又繼承自同一個(gè)公共基類(lèi),那么就構(gòu)成了鉆石繼承體系。這種繼承體系很像豎立的菱形,也稱作菱形繼承。
super()方法保證公共父類(lèi)只被執(zhí)行一次
class A:
def __init__(self):
print('進(jìn)入A')
print('離開(kāi)A')
class B(A):
def __init__(self):
print('進(jìn)入B')
super().__init__()
print('離開(kāi)B')
class C(A):
def __init__(self):
print('進(jìn)入C')
super().__init__()
print('離開(kāi)C')
class D(B, C):
def __init__(self):
print('進(jìn)入D')
super().__init__()
print('離開(kāi)D')
D()
四、多態(tài)
多態(tài): 不同對(duì)象在調(diào)用相同方法時(shí), 呈現(xiàn)不同狀態(tài)
isinstance()方法可以判斷一個(gè)對(duì)象是否屬于某一個(gè)類(lèi)
class Animal():
def eat(self):
print('動(dòng)物吃飯了')
class Dog(Animal):
def eat(self):
print('小狗吃飯了')
class Cat(Animal):
def eat(self):
print('小貓吃飯了')
a = Animal()
b = Dog()
c = Cat()
print(isinstance(a, Animal)) # True 判斷 a 是否輸入 Animal類(lèi)
print(isinstance(b, Dog)) # True
print(isinstance(c, Cat)) # True
print()
print(isinstance(b, Animal)) # True
print(isinstance(c, Animal)) # True 同一個(gè)對(duì)象可以屬于不同的類(lèi)
print()
print(isinstance(a, Dog)) # False 父類(lèi)對(duì)象不屬于子類(lèi)
print()
def eat_eat(animal):
animal.eat()
_list = [Animal, Dog, Cat]
for animal in _list:
animal().eat()
五、鴨子類(lèi)型
鴨子類(lèi)型(英語(yǔ):duck typing)是動(dòng)態(tài)類(lèi)型的一種風(fēng)格。在這種風(fēng)格中,一個(gè)對(duì)象有效的語(yǔ)義,不是由繼承自特定的類(lèi)或?qū)崿F(xiàn)特定的接口,而是由當(dāng)前方法和屬性的集合決定。
“當(dāng)看到一只鳥(niǎo)走起來(lái)像鴨子、游泳起來(lái)像鴨子、叫起來(lái)也像鴨子,那么這只鳥(niǎo)就可以被稱為鴨子。”
我們并不關(guān)心對(duì)象是什么類(lèi)型,到底是不是鴨子,只關(guān)心行為。
class Duck:
def quack(self):
print('嘎嘎嘎, 我是一只可達(dá)鴨')
def feathers(self):
print('我有黃色的羽毛')
class Person:
def quack(self):
print('我也會(huì)嘎嘎嘎, 但我是一個(gè)人')
def feathers(self):
print('我沒(méi)有羽毛')
def in_the_poor(d):
d.quack()
d.feathers()
duck = Duck()
person = Person()
in_the_poor(duck)
in_the_poor(person)
六、類(lèi)的組合
類(lèi)的組合就是一個(gè)對(duì)象具有一個(gè)屬性,這個(gè)屬性的指是另外一個(gè)類(lèi)的對(duì)象。
# 烏龜類(lèi)
class Turtle:
def __init__(self, x):
self.num = x
# 魚(yú)類(lèi)
class Fish:
def __init__(self, x):
self.num = x
# 池塘類(lèi)
class Pool:
def __init__(self, x, y):
#烏龜類(lèi)進(jìn)來(lái)
self.turtle = Turtle(x)
#魚(yú)類(lèi)進(jìn)來(lái)
self.fish = Fish(y)
def print_num(self):
print(f'池塘里有{self.turtle.num}只烏龜, 有{self.fish.num}只魚(yú)')
p = Pool(4, 10)
p.print_num()
七、類(lèi)的私有屬性和方法
私有權(quán)限:在屬性名和方法名 前面 加上兩個(gè)下劃線 __ 類(lèi)的私有屬性 和 私有方法,都不能通過(guò)對(duì)象直接訪問(wèn),但是可以在本類(lèi)內(nèi)部訪問(wèn);
類(lèi)的私有屬性 和 私有方法,都不會(huì)被子類(lèi)繼承,子類(lèi)也無(wú)法訪問(wèn); 私有屬性 和 私有方法 往往用來(lái)處理類(lèi)的內(nèi)部事情,不通過(guò)對(duì)象處理,起到安全作用。
class People(object):
def __init__(self, password):
self.__password = password # 變量前面有兩個(gè)下劃線, 有私有屬性, 外部不可直接訪問(wèn)
def getPassword(self):
return self.__password # 類(lèi)的內(nèi)部可調(diào)用私有屬性
def setPassword(self, new_password):
if len(new_password) >= 6:
self.__password = new_password
else:
print('密碼長(zhǎng)度需大于等于5')
me = People('123456')
print(me.getPassword())
me.setPassword('654321')
print(me.getPassword())
八、魔法方法
? ? ? Python中的魔法方法(Magic Methods),也稱為雙下劃線方法(Dunder Methods),是特殊方法,其名稱以雙下劃線開(kāi)頭和結(jié)尾,例如 __init__、__str__、__add__ 等。這些方法提供了一種使Python對(duì)象能夠使用內(nèi)置函數(shù)和語(yǔ)言結(jié)構(gòu)的方式。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-507385.html
class Obj(int):
def __init__(self, num):
self.num = num
# 自定義類(lèi)對(duì)象的基本計(jì)算方法
def __add__(self, other):
return self.num + other + 1 # 這里的運(yùn)算符繼承于父類(lèi)
def __sub__(self, other):
return self.num - other + 1
def __mul__(self, other):
return self.num * other + 1
def __truediv__(self, other):
return self.num / other + 1
def __floordiv__(self, other):
return self.num // other + 1
# __str__ 是一個(gè)顯示對(duì)象信息的魔法方法
# 這個(gè)方法需要return一個(gè)數(shù)據(jù), 并且只有self一個(gè)參數(shù)
# 當(dāng)在類(lèi)的外部print(對(duì)象), 則打印這個(gè)返回的數(shù)據(jù)
def __str__(self):
return (f'這個(gè)數(shù)是{self.num}')
# __getattr__(self)當(dāng)訪問(wèn)一個(gè)不存在的對(duì)象時(shí), 不報(bào)錯(cuò)
# 是一個(gè)防報(bào)錯(cuò)的異常捕獲機(jī)制
def __getattr__(self, name):
return (f'{name}屬性不存在')
a = Obj(3)
b = Obj(5)
print(a)
print(type(a))
print(a.x)
print(a + b)
print(a - b)
print(a * b)
print(a / b)
print(a // b)
class String(str):
def __init__(self, name):
self.name = name
# __len__(self) 可自定義長(zhǎng)度的計(jì)算方法
def __len__(self):
return len(self.name) - 1
def __str__(self):
return f'這個(gè)字符串是{self.name}'
s = String('hello')
print(s)
print(len('hello'))
print(len(s))
九、單例模式
單例模式(Singleton Pattern)是一種常用的軟件設(shè)計(jì)模式,該模式的主要目的是確保某一個(gè)類(lèi)只有一個(gè)實(shí)例存在。當(dāng)你希望在整個(gè)系統(tǒng)中,某個(gè)類(lèi)只能出現(xiàn)一個(gè)實(shí)例時(shí),單例對(duì)象就能派上用場(chǎng)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-507385.html
class Single:
#創(chuàng)建類(lèi)的隱藏屬性
__instance = None #父類(lèi)new方法的返回值, None的bool值為False
def __new__(cls):
#如果__instance的值為None, 就創(chuàng)建一個(gè)對(duì)象并賦值
if not cls.__instance:
cls.__instance = object.__new__(cls)
return cls.__instance
a = Single()
b = Single()
print(id(a), id(b)) # 地址一樣
a.name = '周周'
a.sex = '帥哥'
print(a.name, a.sex)
print(b.name, b.sex)
b.name = '提速狗'
b.sex = '美女'
print(a.name, a.sex)
print(b.name, b.sex)
到了這里,關(guān)于【Python爬蟲(chóng)與數(shù)據(jù)分析】面向?qū)ο笤O(shè)計(jì)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!