Python中物件導向程式設計的一些高階方法拾遺

超級超級小天才發表於2020-12-05

其他關於Python的總結文章請訪問:https://blog.csdn.net/qq_38962621/category_10299380.html

Python中物件導向程式設計的一些高階方法拾遺

宣告類中的私有變數

定義類中的私有變數,只要將變數名前加雙下劃線即可__,如果一個變數名以__開頭,它就是一個私有變量(private),只能在類內部訪問,不能外部訪問(比如__name)。

但是開頭結尾都有雙下劃線__的變數是特殊變數,特殊變數是可以直接訪問的,不是private變數,所以不要定義這種變數(比如__name__

但但是,其實雙下劃線的變數是可以訪問的,需要使用 單下劃線+類名+雙下劃線的變數名 訪問(比如Student類中的__name變數,可以使用 instance._Student__name 來訪問的),但是既然設定成了私有變數,那就是不想讓訪問,一定要這麼做是沒有什麼特別的好處的

例項屬性與類屬性

定義在類中的 __init__ 函式中的變數(比如self.name)是屬於例項的,即每一個例項都有自己的 self.name。而定義在類中,__init__ 函式外部(前)的變數則是屬於類自己的變數,比如這樣定義的變數:

class Student(object):
    name = 'Student'

屬於類的屬性是不會因例項而異的,所有例項都擁有同樣的類屬性。

限制給例項新增的屬性

動態語言中,可以給物件(object)動態新增屬性,比如一個student例項,可以臨時新增 student.name 的屬性,或者給Student類動態新增屬性 Student.name,使用 __slots__ 可以限制給一個類的實力新增的屬性:

class Student():
    __slots__ = ('name', 'age')

這樣一來Student的例項就只能動態新增nameage兩個屬性,新增其他的會報錯:

student = Student()

student.name = "Hello"
student.age = 12

student.score = 100  # Raise AttributeError: 'Student' object has no attribute 'score'

使用@property將方法“變為”屬性

類中,通常為了不暴露一些變數,或者對一些變數的做限制,會猜用定義一個私有變數(比如score),然後使用兩個方法:一個get方法來獲取變數值(比如get_score)和一個set方法來修改變數的值(比如set_score)來完成。使用時需要呼叫兩個方法。

使用裝飾器 @property 可以更簡單的做到這一點,它可以將一個方法“變成”屬性:

  • 只使用 @property 定義只讀屬性:
class Student():
    @property
    def name(self):
        return "Lily"


student = Student()
print(student.name)
  • 使用 @property 和配套產生的 @NAME.setter 來定義可讀屬性:
class Student():

    @property
    def name(self):
        return self.__name

    @name.setter
    def name(self, name):
        self.__name = name


student = Student()
student.name = "Lily"

print(student.name)

多重繼承

Python支援多重繼承,即一個子類可以繼承自多個父類,只要在子類的括號中傳入多個要繼承的父類即可:

class Student():
    pass

class Teacher():
    pass

class Someone(Student,Teacher):
    pass

相關文章