Python類定義

類class

類定義

python中的類通過關鍵字class定義,類名以大寫字母開頭,并可以繼承已有類:

# Person類繼承object類
class Person(object) :
    pass
# 使用Person()定義實例對象mike
mike = Person()

屬性賦值

實例屬性

class定義的實例包含不同的屬性,實例的屬性也可以被賦值為不同的屬性:

mike = Person()
mike.name = 'Mike'
mike.gender = 'Male'
mike.birth = '1998-1-1'
# 由于Python是動態語言,可以動態為實例添加屬性
mike.address = 'China'

實例屬性可以通過默認執行的init()函數進行初始化:

class Person(object) :
    # __init__函數的第一個參數是留給指向外包的實例變量的,這里為了明確物理意義,用self指代實例自身,當然也可以用其他名稱
    def __init__(self, name, gender, birth) :
         self.name = name
         self.gender = gender
         self.birth = birth
# 在定義實例時,類的參數從第二個參數開始賦值
mike = Person(name, gender, birth)

類屬性

與實例屬性不同,類屬性是綁定在class類本身上的,對于一個class來說只有一份,對于不同的實例也只有一份,而實例屬性對于不同的實例可能是不同的:

# 定義類屬性
class Person(object) :
    address = 'Earth' # 類屬性
    def __init__(self, name) :
        self.name = name # 實例屬性
# 通過類訪問類屬性
print(Person.address)
# 通過類定義的實例訪問類屬性
mike = Person()
print(mike.address)

由于類屬性只有一份,當類屬性被修改時,通過所有實例調用類屬性的返回值都會被改變。

當類屬性名和實例屬性名重復時,通過實例訪問該命名屬性會優先返回實例屬性,因為實例屬性優先級高于類屬性。

類屬性可以通過類訪問

類屬性的訪問權限限制

在類的屬性定義中,有些屬性是不希望被外部訪問的,通過在屬性名前加雙下劃線'__'表示該屬性不可被外部訪問:

# 命名前加雙下劃線的屬性不可被外部訪問
__attribute
# 前后都加雙下劃線的屬性被稱為特殊屬性,可以被外部訪問
__attribute__
# 前面加單下劃線的屬性可以被外部訪問,但是按照習慣,不應該被外部訪問
_attribute

定義方法

定義實例方法

定義實例的方法就是在類中定義函數,函數的第一個參數永遠是self,指向實例本身:

class Person(object) :
    def __init__(self, name) :
        self.__name = name
    def get_name(self) :
        return self.name

定義類方法

類方法與實例方法的關系類似于類屬性與實例屬性的關系,類方法綁定在類上,類方法也可以通過類或實例調用:

class Person(object):
    __count = 0
    @classmethod # 通過裝飾器classmethod裝飾類方法
    def how_many(cls) :
        return cls.__count
    def __init__(self, name) :
        self.name = name
        Person.__count += 1

類繼承

class Person(object) :
    def __init__(self, name, gender) :
         self.name = name
         self.gender = gender
class Student(Person) :
    def __init__(self, name, gender, score) :
        # 通過super()訪問Student繼承的類Person,并調用Person的__init__函數,如果不調用的話,Student會沒有Person的兩個屬性。
        super(Student, self).__init__(name, gender)
        self.score = score

類的多態

繼承類和父類的同名函數實現類的多態性,并且繼承類的函數優先級更高。

多重繼承

class A(B,C) :
    pass

類的特殊方法

可以為自定義類定義特殊方法,相當于函數重載。

  • str() :將類的實例變為str,并顯示給用戶。
  • repr():將類的實例變為str,并顯示為開發人員。
  • cmp():比較函數。如果輸入左值在前,返回-1,如果輸入右值在前,返回1。
  • len():返回實例長度。
  • add():加法。
  • int(): 類型轉換為整數。
  • float():類型轉換為浮點數。
  • slot():建立一個允許在類中添加的屬性列表。
class Student(object):
    __slots__ = ('name', 'gender', 'score')
    def __init__(self, name, gender, score):
        self.name = name
        self.gender = gender
        self.score = score
  • call():將一個類實例變為一個可調用對象。

@property裝飾器

@property裝飾器可以將函數重載為屬性,使得函數可以像屬性一樣被調用:

class Student(object):
    def __init__(self, name, score):
        self.name = name
        self.__score = score
    # @property為函數增加獲取屬性操作
    @property
    def score(self):
        return self.__score
    # @property的setter為函數增加賦值屬性操作
    @score.setter # 在已經裝飾過的score上操作
    def score(self, score):
        if score < 0 or score > 100
            raise ValueError('invalid score')
            self.__score = score

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 要點: 函數式編程:注意不是“函數編程”,多了一個“式” 模塊:如何使用模塊 面向對象編程:面向對象的概念、屬性、...
    victorsungo閱讀 1,562評論 0 6
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,923評論 18 139
  • Python進階框架 希望大家喜歡,點贊哦首先感謝廖雪峰老師對于該課程的講解 一、函數式編程 1.1 函數式編程簡...
    Gaolex閱讀 5,524評論 6 53
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,880評論 1 10
  • 國家電網公司企業標準(Q/GDW)- 面向對象的用電信息數據交換協議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 11,145評論 6 13