python -- 面向?qū)ο缶幊?/h2>

面向?qū)ο缶幊?/h1>

python中一切皆為對(duì)象,所謂對(duì)象:人是一個(gè)對(duì)象,電腦是一個(gè)對(duì)象

我們通過(guò)描述屬性(特征)和行為來(lái)描述一個(gè)對(duì)象的。

什么是類

在python中,一個(gè)對(duì)象的特征也稱為屬性(attribute)。它所具有的行為也稱為方法(method)

結(jié)論:對(duì)象=屬性+方法

在python中,把具有相同屬性和方法的對(duì)象歸為一個(gè)類(class)

比如人,動(dòng)物,植物等等,這些都是類的概念。

類是對(duì)象的模板或藍(lán)圖,類是對(duì)象的抽象化,對(duì)象是類的實(shí)例化。類不代表具體的事物,而對(duì)象表示

具體的事物。

  • 類(Class): 用來(lái)描述具有相同的屬性和方法的對(duì)象的集合。它定義了該集合中每個(gè)對(duì)象所共有的屬

    性和方法。對(duì)象是類的實(shí)例。

  • 類變量:類變量在整個(gè)實(shí)例化的對(duì)象中是公用的。類變量定義在類中且在函數(shù)體之外。類變量通常

    不作為實(shí)例變量使用。

  • 數(shù)據(jù)成員:類變量或者實(shí)例變量用于處理類及其實(shí)例對(duì)象的相關(guān)的數(shù)據(jù)。

  • 方法重寫:如果從父類繼承的方法不能滿足子類的需求,可以對(duì)其進(jìn)行改寫,這個(gè)過(guò)程叫方法的覆

    蓋(override),也稱為方法的重寫。

  • 實(shí)例變量:定義在方法中的變量,只作用于當(dāng)前實(shí)例的類。

  • 繼承:即一個(gè)派生類(derived class)繼承基類(base class)的字段和方法。繼承也允許把一個(gè)

    派生類的對(duì)象作為一個(gè)基類對(duì)象對(duì)待。例如,有這樣一個(gè)設(shè)計(jì):一個(gè)Dog類型的對(duì)象派生自Animal

  • 類,這是模擬"是一個(gè)(is-a)"關(guān)系(例圖,Dog是一個(gè)Animal)。

  • 實(shí)例化:創(chuàng)建一個(gè)類的實(shí)例,類的具體對(duì)象。

  • 方法:類中定義的函數(shù)。

  • 對(duì)象:通過(guò)類定義的數(shù)據(jù)結(jié)構(gòu)實(shí)例。對(duì)象包括兩個(gè)數(shù)據(jù)成員(類變量和實(shí)例變量)和方法。

使用class定義類

#類的最簡(jiǎn)形式
class Person():
    '著定義了一個(gè)類,但是沒(méi)有什么功能'
    pass

someone = Person()

同函數(shù)一樣,用pass 表示這個(gè)類是一個(gè)空類

class Person():
    def __init__(self):
        print ('女的,是個(gè)活的')
        pass

someone = Person()

當(dāng)你在類聲明里定義__init__() 方法時(shí),第一個(gè)參數(shù)必須為self。盡管self 并不是一

個(gè)Python 保留字,但它很常用。沒(méi)有人(包括你自己)在閱讀你的代碼時(shí)需要猜測(cè)使用self
的意圖。

添加name 參數(shù)

class Person():
    def __init__(self,name):
        self.name = name

someone = Person('xiaohong')

print(someone.name)

第一種方法__init__()方法是一種特殊的

方法,被稱為類的構(gòu)造函數(shù)或初始化方法,當(dāng)創(chuàng)
建了這個(gè)類的實(shí)例時(shí)就會(huì)調(diào)用該方法

class Person():
    def __init__(self,name,age):
        self.name = name
        self.age = age
        print('__init__函數(shù)執(zhí)行了')

someone = Person('xiaohong',18)

print(someone.name)
print(someone.ega)
#記錄類被實(shí)例化的次數(shù),再加一個(gè)函數(shù)用于輸出我們的類的屬性
class Person():
    '這是一個(gè)人的類,可以為我們實(shí)例化對(duì)象'
    person_count = 0

    def __init__(self,name,age):
        self.name = name
        self.age = age
        Person.person_count +=1

    def display_person(self):
        print('姓名:%s,年齡:%s'%(self.name,self.age))

someone1 = Person('xiaohong','18')
someone2 = Person('xiaoli','19')

print(someone.name)
print(someone.age)
print(someone.display_person())
print(someone.person_count)

print(someone1.__class__)
print(someone1.__doc__)#獲取類說(shuō)明

類的繼承

從已有類中衍生出新的類,添加或修改部分功能。

#繼承

class Car():
    def car_print(self):
        print('''I'm drive a car!!!''')

class Benz(Car):
    pass

drive_car = Car()
drive_Benz = Benz()

print(drive_car.car_print())
print(drive_Benz.car_print())

覆蓋方法(重寫)

#重寫
class Car():
    def car_print(self):
        print('''I'm drive a car!!!''')

class Benz(Car):
    def car_print(self):
        print("I'm drive a Benz car!!!")

drive_car = Car()
drive_Benz = Benz()

drive_car.car_print()
drive_Benz.car_print()

初始化函數(shù)重寫

class Person():
    def __init__(self,name):
        self.name = name

class MLPerson(Person):
    def __init__(self,name):
        self.name = "我是漂亮的"+name

class SJRYPerson(Person):
    def __init__(self,name):
         self.name = "我是善解人意的"+name

someone1 = Person('laowang')
someone2 = MLPerson('xiaoli')
someone3 = SJRYPerson('xiaohong')

子類添加新方法

#子類里面添加新方法
class Car():
    def car_print(self):
        print('''I'm drive a car!!!''')

class Benz(Car):
    def car_print(self):
        print("I'm drive a Benz car!!!")
    def didi(self):
        print('didididid!!!')

drive_car = Car()
drive_Benz = Benz()

drive_car.car_print()
drive_Benz.car_print()
drive_Benz.didi()

使用super從父類得到方法

class Person():
    def __init__(self,name):
        self.name = name

class QQPerson(Person):
    def __init__(self,name,QQ):
        super().__init__(name)
        self.qq = QQ

someone = QQPerson('七喜小子','777777')
someone.name
someone.qq

屬性(property)

#屬性 property   ‘getter setter’

class Person():
    def __init__(self,first_name,last_name):
        self.first_name = first_name
        self.last_name = last_name

    def full_name(self):
        return '%s %s'%(self.first_name,self.last_name)

someone = Person('王','小紅')
someone.first_name
someone.last_name
someone.full_name()

someone.first_name = '劉'

someone.full_name = '劉小紅'
someone.full_name


#使用@property
class Person():
    def __init__(self,first_name,last_name):
        self.first_name = first_name
        self.last_name = last_name
    @property
    def full_name(self):
        return '%s %s'%(self.first_name,self.last_name)

someone = Person('王','小紅')
someone.first_name
someone.last_name
someone.full_name = '劉曉紅'  # @property將類中方法只讀屬性

#@property實(shí)現(xiàn)getter,seter方法

class Duck():
    def __init__(self,input_name):
        self.hidden_name = input_name
    @property
    def name(self):
        print('insder the getter')
        return self.hidden_name
    @name.setter
    def name(self,input_name):
        print('insder the setter')
        self.hidden_name = input_name

duck = Duck('tanglaoye')

duck.name
duck.name ='米老鼠'
duck.hidden_name='唐老鴨'

名稱重整

#名稱重整
class Duck():
    def __init__(self,input_name):
        self.__name = input_name
    @property
    def name(self):
        print('insder the getter')
        return self.__name
    @name.setter
    def name(self,input_name):
        print('insder the setter')
        self.__name = input_name

duck = Duck('tanglaoye')

duck.name='唐老鴨'
duck.name
duck.__name

duck._Duck__name = '米老鼠'

方法的類型

以self 作為第一個(gè)參數(shù)的方法都是實(shí)例方法(instance method)。上面已經(jīng)對(duì)實(shí)例方法做了說(shuō)明,這里就不再累述。

與之相對(duì),類方法(class method)會(huì)作用于整個(gè)類,對(duì)類作出的任何改變會(huì)對(duì)它的所有實(shí)例對(duì)象產(chǎn)生影響。在類定義內(nèi)部,用前綴修飾符@classmethod 指定的方法都是類方法。與實(shí)例方法類似,類方法的第一個(gè)參數(shù)是類本身。在Python 中,這個(gè)參數(shù)常被寫作cls,因?yàn)槿Qclass 是保留字,在這里我們無(wú)法使用。

class Person():
    '類方法的演示'
    count = 0
    def __init__(self):
        Person.count += 1

    @classmethod
    def my_count(cls):
        print('Person類被實(shí)例化了%s次'%cls.count)

someone =Person()
someone1 =Person()
someone2 =Person()
someone.my_count()
Person.my_count()

靜態(tài)方法

類定義中的方法還存在著第三種類型,它既不會(huì)影響類也不會(huì)影響類的對(duì)象。它們出現(xiàn)在類的定義中僅僅是為了方便,否則它們只能孤零零地出現(xiàn)在代碼的其他地方,這會(huì)影響代碼的邏輯性。這種類型的方法被稱作靜態(tài)方法(static method),用@staticmethod 修飾,它既不需要self 參數(shù)也不需要class 參數(shù)。

@staticmethod

class Person():
    @staticmethod
    def saying():
        print('有朋自遠(yuǎn)方來(lái),不亦說(shuō)乎!')


Person.saying()

鴨子類型

Python 對(duì)實(shí)現(xiàn)多態(tài)(polymorphism)要求得十分寬松,這意味著我們可以對(duì)不同對(duì)象調(diào)用同名的操作,甚至不用管這些對(duì)象的類型是什么。

#創(chuàng)建三個(gè)類,分別是地瓜、土豆,吃瓜群眾

class TD():
    def __init__(self,person,words):
        self.person  = person
        self.words = words
    def who(self):
        return self.person
    def says(self):
        return self.words + " 。"

class DG(TD):
    def says(self):
        return self.words + "!"
class CG(TD):
    def says(self):
        return self.words + "......"

td = TD('土豆','地瓜地瓜,我是土豆')
dg = DG('地瓜','你叫誰(shuí)地瓜呢')
cg = CG('吃瓜群眾','哈哈哈哈哈')

td.who()
td.says()

dg.who()
dg.says()

cg.who()
cg.says()

class Duck():
    def who(self):
        return '唐老鴨'
    def says(self):
        return 'gagaga……'

duck = Duck()

#這里我們要演示一下動(dòng)態(tài)類型
def who_say(obj):
    print(obj.who() ,'saying:',obj.says())

who_say(td)
who_say(dg)
who_say(cg)

who_say(duck)

這種方式有時(shí)被稱作鴨子類型(duck typing),這個(gè)命名源自一句名言:

如果它像鴨子一樣走路,像鴨子一樣叫,那么它就是一只鴨子。

特殊方法

到目前為止,你已經(jīng)能創(chuàng)建并使用基本對(duì)象了?,F(xiàn)在再往深鉆研一些。當(dāng)我們輸入像a = 3 + 8 這樣的式子時(shí),整數(shù)3 和8 是怎么知道如何實(shí)現(xiàn)+ 的?同樣,a又是怎么知道如何使用= 來(lái)獲取計(jì)算結(jié)果的?你可以使用Python 的特殊方法(specialmethod),有時(shí)也被稱作魔術(shù)方法(magic method),來(lái)實(shí)現(xiàn)這些操作符的功能。別擔(dān)心,不需要甘道夫8 的幫助,它們一點(diǎn)也不復(fù)雜。

這些特殊方法的名稱以雙下劃線(__)開(kāi)頭和結(jié)束。沒(méi)錯(cuò),你已經(jīng)見(jiàn)過(guò)其中一個(gè):__init__,它根據(jù)類的定義以及傳入的參數(shù)對(duì)新創(chuàng)建的對(duì)象進(jìn)行初始化。假設(shè)你有一個(gè)簡(jiǎn)單的Word 類,現(xiàn)在想要添加一個(gè)equals() 方法來(lái)比較兩個(gè)詞是否一致,忽略大小寫。也就是說(shuō),一個(gè)包含值'ha' 的Word 對(duì)象與包含'HA' 的是相同的。下面的代碼是第一次嘗試,創(chuàng)建一個(gè)普通方法equals()。self.text 是當(dāng)前Word 對(duì)象所包含的字符串文本,equals() 方法將該字符串與word2(另一個(gè)Word 對(duì)象)所包含的字符串做比較

#傳統(tǒng)方式
class Word():
    def __init__(self,text):
        self.text = text

    def equals(self,word2):
        return self.text.lower() == word2.text.lower()

ha1 = Word('Ha')
ha2 = Word('ha')
he = Word('he')

ha1.equals(ha2)
ha1.equals(he)
#ha1 == ha2

#魔法方法
class Word():
    def __init__(self,text):
        self.text = text

    def __eq__(self,word2):
        return self.text.lower() == word2.text.lower()

ha1 = Word('Ha')
ha2 = Word('ha')
he = Word('he')

ha1 == ha2
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容