Python中類、對(duì)象和繼承相關(guān)知識(shí)

定義類并創(chuàng)建對(duì)象

在Python中定義類的寫法為:class 類名:即可定義出一個(gè)類(注意:類名首字母大寫)

由類創(chuàng)建對(duì)象的寫法為變量名 = 類名()

Python中的屬性

Python中的屬性可分為兩類:

1.類屬性:由類來(lái)維護(hù)的屬性,對(duì)象在訪問(wèn)這種屬性時(shí),訪問(wèn)的是同一個(gè)值(即,對(duì)象的共有財(cái)產(chǎn))

2.實(shí)例屬性:通過(guò)類創(chuàng)建出來(lái)的對(duì)象擁有,每個(gè)對(duì)象都維護(hù)自己獨(dú)有的屬性

可以將類屬性理解為公有屬性,實(shí)例屬性理解為私有屬性

類屬性寫法:直接在類中添加屬性名和屬性值

class Student:
    country = 'china' # 類屬性
stu1 = Student()

實(shí)例屬性寫法:實(shí)例屬性定義在__init__函數(shù)里面,且該函數(shù)接收的第一個(gè)參數(shù)(一般寫為self)是指針類型且永遠(yuǎn)指向該類創(chuàng)建出來(lái)的某個(gè)對(duì)象(即,通過(guò)類創(chuàng)建對(duì)象的時(shí)候,指針指向就確定了),函數(shù)接收的其它參數(shù)為創(chuàng)建對(duì)象時(shí)所需的形參

class Student:
    country = 'china'
    def __init__(self, name, age):
        self._name = name # 實(shí)例屬性_name
        self._age = age # 實(shí)例屬性_age
stu1 = Student('李四', '18')

__init__函數(shù)在調(diào)用類創(chuàng)建對(duì)象過(guò)程中會(huì)自行調(diào)用執(zhí)行,不需要手動(dòng)調(diào)用__init__函數(shù)

Python中的方法

Python中的方法可分為三類:

1.類方法:屬于類的方法,由類來(lái)維護(hù)(對(duì)象的公有財(cái)產(chǎn))

2.實(shí)例方法:屬于對(duì)象的方法,由對(duì)象自己維護(hù)的方法(對(duì)象的私有財(cái)產(chǎn))

3.靜態(tài)方法:函數(shù)占據(jù)了類的命名空間,調(diào)用時(shí)需要通過(guò)類名+方法名才能調(diào)用。靜態(tài)方法和通過(guò)該方法創(chuàng)建出來(lái)的對(duì)象沒有任何關(guān)系

可以將類方法理解為公有方法,實(shí)例方法為私有方法

只有是沒有調(diào)用過(guò)類、對(duì)象下的屬性,就可以聲明為靜態(tài)方法

類方法的寫法:通過(guò)系統(tǒng)裝飾器@classmethod聲明函數(shù)為類方法,且該函數(shù)接收的第一個(gè)參數(shù)(一般寫為cls)是指針類型,指向的是類本身,類方法只能訪問(wèn)類屬性,不能訪問(wèn)實(shí)例屬性。函數(shù)接收的其它參數(shù)為創(chuàng)建對(duì)象時(shí)所需的形參

    @classmethod
    def say(cls):
        print('我來(lái)自:' + cls.country)
        
        # print('我來(lái)自:' + cls._age)
        # 報(bào)錯(cuò):AttributeError: type object 'Student' has no attribute '_age'
        
stu1.say() # 我來(lái)自:china

實(shí)例方法的寫法:直接在類里添加函數(shù),不需要裝飾器修飾,其它寫法和類方法一樣,第一個(gè)參數(shù)一般寫為self用以區(qū)分。實(shí)例方法既訪問(wèn)類屬性,也能訪問(wèn)實(shí)例屬性

    def hello(self):
        print('我的祖國(guó)是:' + self.country)
        print('我叫:' + self._name)

stu1.hello() # 我的祖國(guó)是:china    我叫:李四

靜態(tài)方法的寫法:通過(guò)系統(tǒng)裝飾器@staticmethod聲明函數(shù)為類方法

    @staticmethod
    def soy():
        print('我是打醬油的')
        
Student.soy() # 我是打醬油的

創(chuàng)建一個(gè)簡(jiǎn)單的類

class Student:
    country = 'china'
    def __init__(self, name, age):
        self._name = name
        self._age = age

    @classmethod
    def say(cls):
        print('我來(lái)自:' + cls.country)

    def hello(self):
        print('我的祖國(guó)是:' + self.country)
        print('我叫:' + self._name)

    @staticmethod
    def soy():
        print('我是打醬油的')

stu1 = Student('李四', '18')
stu1.say()
stu1.hello()
Student.soy()

特性:property

特性作用及寫法

作用:如果調(diào)用特性,則用戶只能訪問(wèn),不能設(shè)置;隱藏真實(shí)的實(shí)例屬性,防止用戶亂更改或誤操作

寫法:通過(guò)系統(tǒng)裝飾器@property聲明函數(shù)

class Circle:
    def __init__(self, r):
        self._r = r
        
    @property
    def r(self):
        return self._r

cir = Circle(10);
print(cir.r)

設(shè)置器作用及用法

作用:專門提供給特性使用,用來(lái)修改特性的值

寫法:通過(guò)系統(tǒng)裝飾器@特性名.setter聲明函數(shù)

    @r.setter
    def r(self, num):
        if type(num) is int:
            self._r = num
        else:
            print('請(qǐng)?jiān)O(shè)置整數(shù)值')
            
cir.r = 20

刪除器作用及寫法

作用:通過(guò)del刪除某個(gè)特性時(shí),如果定義了刪除器,該操作會(huì)執(zhí)行刪除其中的代碼

寫法:通過(guò)系統(tǒng)裝飾器@特性名.deleter聲明函數(shù)

    @r.deleter
    def r(self):
        print('can not delete')
        
del cir.r # 不加刪除器會(huì)報(bào)錯(cuò):AttributeError: can't delete attribute

屬性私有化

讓當(dāng)前類的私有屬性不會(huì)被子類繼承到

Python中私有化機(jī)制:是屬性名改寫。在所有需要私有化的屬性前添加__,則該屬性名就會(huì)變成:_類名__屬性名

class Student:
    def __init__(self):
        self.__name = '張三'

    def say(self):
        print('hello,我是' + self.__name)

stu = Student()
stu.say();
print(stu._Student__name)
# print(stu.name) 報(bào)錯(cuò):AttributeError: 'Student' object has no attribute 'name'

繼承

聲明繼承關(guān)系:在子類名后跟小括號(hào),小括號(hào)里是要繼承的父類名

注意:

1.在繼承父類實(shí)例屬性時(shí),要先手動(dòng)調(diào)用父類的init函數(shù)

繼承關(guān)系中的init方法的執(zhí)行邏輯:在子類沒有實(shí)現(xiàn)init方法時(shí),會(huì)觸發(fā)父類中的init執(zhí)行;如果子類實(shí)現(xiàn)了init,不會(huì)觸發(fā)父類的init執(zhí)行

2.在子類復(fù)寫父類時(shí),要先手動(dòng)調(diào)用父類相應(yīng)的方法

class A:
    def __init__(self):
        self.name = 'zhangsan'
        print('我是父類的init')
    def say(self):
        print('我是父類')
# 聲明繼承關(guān)系:在子類名后跟小括號(hào),小括號(hào)里是要繼承的父類名
class B(A):
    def __init__(self):
        # 手動(dòng)調(diào)用父類的init函數(shù)
        A.__init__(self)
        print('我是子類的init')
    def bSay(self):
        print('我是子類')
        
    # 在子類中復(fù)寫父類
    def say(self):
        A.say(self)
        print('我是復(fù)寫的新數(shù)據(jù)')

b = B()
print(b.name)
最后編輯于
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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