1. 程式人生 > >python中的類和繼承學習筆記

python中的類和繼承學習筆記

與C++和JAVA一樣,python也是一種面向物件的語言,但具體使用和C++有一些不同之處。下面按照封裝、繼承、多型的順序對python面向物件程式設計進行一個總結。

封裝

class testclass1:
    def __init__(self):
        print(__name__)
    def class1fun(self,a,b):
        print(a+b)
    __pri = 0 #private變數,只能類內部呼叫
    _pro = 0 #protected變數,只能類內部呼叫
    def __prifun(self):
        print('this is a private function')
    def _profun(self):
        print('this is a protected function')

用C++類比,則__init__函式相當於建構函式。命名最前面有兩個_的函式或者變數為private形,一個_就是protected形,沒有當然就是public。但是python實際的做法是把變數的名字用 _classname__變數名 來替換了這個變數,在類外仍然可以用這個名字來訪問。.self基本可以類比於this指標,self代表形參中有一個是類的例項。在每個類內函式的形參中第一個必須為self.所有函式都可以過載。

同時類內都具有一系列的專用方法(來自菜鳥教程),也都可以過載:

__init__ : 建構函式,在生成物件時呼叫
__del__ : 解構函式,釋放物件時使用
__repr__ : 列印,轉換
__setitem__ : 按照索引賦值
__getitem__: 按照索引獲取值
__len__: 獲得長度
__cmp__: 比較運算

__call__: 函式呼叫

以下為運算子,可以過載,相當於operator x 的過載:

__add__: 加運算
__sub__: 減運算
__mul__: 乘運算
__div__: 除運算
__mod__: 求餘運算

__pow__: 乘方

可以使用點(.)來訪問物件的屬性,經過測試,需要是在__init__()函式內部定義的self.x形式的屬性

也可以使用以下函式的方式來訪問屬性:

  • getattr(obj, name,[default]) : 訪問物件的屬性

  • hasattr(obj,name) : 檢查是否存在一個屬性

  • setattr(obj,name,value) : 設定一個屬性。如果屬性不存在,會建立一個新屬性
  • delattr(obj, name) : 刪除屬性

Python內建類屬性

  • __dict__ : 類的屬性(包含一個字典,由類的資料屬性組成)

  • __doc__ :類的文件字串

  • __name__: 類名

  • __module__: 類定義所在的模組(類的全名是'__main__.className',如果類位於一個匯入模組mymod中,那麼className.__module__ 等於 mymod)

  • __bases__ : 類的所有父類構成元素(包含了以個由所有父類組成的元組)


繼承

 寫出一個testclass1類的子類:

class childclass1(testclass1):
    def newfunc(self):
        self._profun()
        # self.__prifun()  #子類物件使用會報錯

在新定義的函式中的_profun和__prifun函式分別為testclass1類中的protected和private函式。保護變數和函式在子類中被繼承,但不可以外部引用,private型則不可被子類物件訪問。但需要注意,不可被子類物件訪問,但在子類呼叫可訪問的父類函式時,函式內部會根據需要呼叫父類的private變數和函式

實際上,在寫自己的父類的時候,我們已經用到了繼承所有類都繼承自Object類。上面的類實際可以寫成:

class testclass1(Object): #後省略

python支援多繼承。

class childclass1(testclass1,testclass2,...):
子類可以使用多個父類中的變數和函式。

多型

 多型是類和繼承中最容易出錯的地方。

首先,python沒有過載和虛擬函式,沒有過載和虛擬函式,沒有過載和虛擬函式!!!python子類和父類同名函式只能是重寫關係,即引數個數和函式名都一樣,不能使用重定義。

當子類物件要呼叫父類被重寫的函式時,使用super()函式定義一個超類

super(type,[object-or-type])

super類的定義比較複雜,我們可以直接注意使用方法,大體有兩種:

super(類名,self).fun or var #用於在子類內部使用父類的方法
super(類名,類的物件).fun or var #用於在宣告子類物件後使用父類方法

多繼承時,如果幾個父類有相同的函式,在super呼叫的時候會呼叫排名最靠前的父類函式。




相關推薦

python繼承學習筆記

與C++和JAVA一樣,python也是一種面向物件的語言,但具體使用和C++有一些不同之處。下面按照封裝、繼承、多型的順序對python面向物件程式設計進行一個總結。封裝class testclass1: def __init__(self): pr

Python對象在內存是如何保存?

blog obj ges images tro 大致 idt 找到 創建對象 類以及類中的方法在內存中只有一份,而根據類創建的每一個對象都在內存中需要存一份,大致如下圖: 如上圖所示,根據類創建對象時,對象中除了封裝 name 和 age 的值之外,還會保存一個類對象指針

python——元組字典學習筆記

deepcopy 例子 [] items 是個 rev put 次數 style 1.count返回值的次數 list=[2,2,2,3,3,3,3,4,4,4] a={} for i in list: if list.count(i)>1:

Python基礎繼承學習

#類 class CocaCola: formula = ['caffeine','sugar','water','soda'] def drink(self): print('Energy!') coke = CocaCola() coke.drink()

Python的函式---基礎學習筆記(七)

一、函式的定義與呼叫 1、函式的定義格式: def函式名(): 程式碼 2、呼叫函式:定義了函式之後,就相當於有了一個具有某更能的程式碼,想要讓這些程式碼能夠執行,需要呼叫它 呼叫函式很簡單的,通過

C++物件學習筆記(3)

1.初始化列表 a.建構函式體賦值 在建立物件時,編譯器可以通過呼叫建構函式,給物件中各個成員變數一個合適的初始值。但是雖然建構函式呼叫之後,物件中已經有了一個初始值,但是不能將其稱作為類物件成員的

Python 例項的通俗講解

這篇文章是我看到的講解Python類與例項的文章中講的比較通俗易懂的,因此我將其轉載過來,供大家共同學習! class Person: 注意,類的名稱一般用大寫字母開頭,這是慣例。當然,如果故意不遵循此慣例,也未嘗不可,但是,會給別人閱讀乃至於自己以後

Python對象的概念,面向對象編程

server def cte 面向對象 serve .com int elf 面向對象編程 轉載:[http://helpserver.chiwudaili.com/detail.aspx?id=abc09aa1b3ee43dccc576fec0b211cf2 #CTest

python繼承與方法重寫

在python中繼承中的一些特點: 1:在繼承中基類的構造(init()方法)不會被自動呼叫,它需要在其派生類的構造中親自專門呼叫。 2:在呼叫基類的方法時,需要加上基類的類名字首,且需要帶上self引數變數。區別於在類中呼叫普通函式時並不需要帶上self引

ES6Class的繼承 學習筆記

class ColorPoint extends Point { constructor(x, y, color) { super(x, y); // 呼叫父類的constructor(x, y) this.color = color;

Python繼承,函式過載,匿名物件

 class CEmployeeBase:  def __init__(self,val):   self.opt,self.target=self.subclassfunc()   print("opt={},target={}".format(self.opt,se

python的面向物件學習以及繼承繼承順序

繼承 首先編寫一串關於類的程式碼行: __author__ = "Yanfeixu" # class People: 經典類不用加(object) class People(object): #新式類 def __init__(self,name,age):

python封裝、繼承多型——python學習筆記

1. 準備 封裝、繼承和多型在程式語言中專指面向物件程式設計的特性,下面先給出一個python中建立類的例子: class Student(object): def __init__(self, name, score): self.name = name

python學習筆記(源碼版)

類的使用1.1第一段代碼 #定義一個類(define a class ) class Cat: #屬性(attribution) #方法(methods) def eat(self): print("cat is eating

探究Java繼承--------Java的系列學習之路(15)

前言—— 今天是軍訓的第5天,昨天打了一天的軍體拳(哈哈哈,好好看本篇博文,不然博主一套軍體拳下去你可能會殘疾  :) 明天是最後一天了,今晚繼續做自己手頭上的事,避免碌碌無為。今天講解的內容——類和繼承,也是跟上一篇一樣,基礎且重要。 第5天沒把這篇文章寫完,今天第六

Android知識體系梳理筆記五:Kotlin學習筆記一:繼承以及Anko(全)的基本使用

前言 對於kotlin,我是邊寫專案邊學的方式來學習的,這些都是在做專案的時候遇到的問題及擴充套件學習的時候記錄的,雖然有些內容不會涉及,但是我認為這種邊寫程式碼邊學習的方式特別有助於記憶,畢竟紙上得來終覺淺! 類和繼承 Kotlin較Java在繼承和實現

python*args **kwargs 的用法學習筆記

*args 和 **kwargs 主要用於函式定義。 你可以將不定數量的引數傳遞給一個函式。1、*args 是用來發送一個(非鍵值對)可變數量的引數列表給一個函式 這裡有個例子幫你理解這個概念: def test_var_args(f_arg, *argv):     pr

python的多繼承(經典新式

python和C++一樣,支援多繼承。概念雖然容易,但是困難的工作是如果子類呼叫一個自身沒有定義的屬性,它是按照何種順序去到父類尋找呢,尤其是眾多父類中有多個都包含該同名屬性。class P1 #(object):    def foo(self):             

《C#圖解教程》讀書筆記之四:繼承

intern html pan 類中訪問 ted obj 小寫 his new 本篇已收錄至《C#圖解教程》讀書筆記目錄貼,點擊訪問該目錄可獲取更多內容。 一、萬物之宗:Object   (1)除了特殊的Object類,其他所有類都是派生類,即使他們沒有顯示基類定義。   

JavaSECollection集合框架學習筆記(2)——拒絕重復內容的Set支持隊列操作的Queue

%d eof 是否 face 出錯 can 3.2 lean als 前言:俗話說“金三銀四銅五”,不知道我要在這段時間找工作會不會很艱難。不管了,工作三年之後就當給自己放個暑假。 面試當中Collection(集合)是基礎重點.我在網上看了