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引
ES6中Class的繼承 學習筆記
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類,其他所有類都是派生類,即使他們沒有顯示基類定義。
JavaSE中Collection集合框架學習筆記(2)——拒絕重復內容的Set和支持隊列操作的Queue
%d eof 是否 face 出錯 can 3.2 lean als 前言:俗話說“金三銀四銅五”,不知道我要在這段時間找工作會不會很艱難。不管了,工作三年之後就當給自己放個暑假。 面試當中Collection(集合)是基礎重點.我在網上看了