MIT6.0001 筆記,LECTURE 8:Object Oriented Programming (class,object,method)
本節課主要講述了class,object,method這些概念。
1.首先講述了python中的任何一個資料型別都是一個類。任何一個資料,都是類的一個實體。類的作用能夠更好地抽象所描述的物件,將相關的資料和方法封裝起來。對於相似功能的方法,因為屬於不同的類,可以有同樣的命名,但是功能卻更適合所屬的類。
2.其次舉例說明了類,物件,方法的定義,實現和使用的方法。這裡舉了一個Fraction類的編寫過程的例子。
本篇筆記和程式碼都來自於MIT的公開課,第八課,物件導向程式設計。《Introduction to Computer Science and Programming in Python》。
什麼是物件
Python中的每一種資料型別都是一個物件,比如int,float,string,list,dict。都是一個物件。每個物件都有
- 一種型別
- 一種資料表示方法
- 一些方法,用於互動
簡單例子
一個常見的類,list。
x_list = ['Peggy','Susie','Daniel']
list是一個類(class),x_list是物件(object),也可以說是類的一個例項(instance)。在list這個類裡面,定義了 +, *, append(),pop() 等等方法(method)。
編寫一個類
任務:編寫一個類,Fraction。
要求:
- 輸入是分子和分母,都是整型。
- 可以做分數加減法和倒數運算。
- 輸出有分數形式和小數形式。
步驟:
1.寫class的定義,定義的格式如下
class 關鍵字 class的名稱 (class的父類)
class Fraction(object):
object意味著Fraction是一個python物件,並且繼承了object的所有attribute。
object是Fraction的一個超集,而Fraction是object的一個子集。
2._init_()方法,接受輸入引數,賦值給class的型別。賦值之前先判斷輸入是否為整型。所有在該型別下使用的instance variable,都必須在__init__()方法類定義,最好不要在其他方法內隨意寫self.variable,以免在繼承時發生錯誤。初始化時將沒有傳入引數的變數設定為預設值或者為空。
def __init__(self, num, denom):
""" num and denom are integers """
assert type(num) == int and type(denom) == int, "ints not used"
self.num = num
self.denom = denom
3._str_()方法,用來定義使用print(object)的輸出格式。如果沒有定義,則列印結果會是 xx object at xx address。
def __str__(self):
""" Retunrs a string representation of self """
return str(self.num) + "/" + str(self.denom)
4._add_(),_sub_(),和_float_()方法,分別對應操作符 +,- 和float()方法。
def __add__(self, other):
""" Returns a new fraction representing the addition """
top = self.num*other.denom + self.denom*other.num
bott = self.denom*other.denom
return Fraction(top, bott)
5.inverse()方法,用來求倒數。
def inverse(self):
""" Returns a new fraction representing 1/self """
return Fraction(self.denom, self.num)
編寫完成,就可以定義Fraction的物件,然後完成相應的操作和運算。
方法有兩類,一類是像 _init_(),前後各有兩個下劃線的,他們對應特定的操作符。這種方法使用時可以直接使用method(object),也可以class.methed(object).比如下方例子print(float©) 和 print(Fraction._float_©)。這類方法是python預先保留的。
另一類是inverse(),格式只能為object.method()。這種方式強調了inverse()是屬於Fraction 類的一個method。這類方法是使用者定義的。在類的定義過程中,一個成員方法可以直接引用類的其他成員方法,引用方法為 class.method(self, variables),記住一定要寫self。
以上程式碼的執行結果如下
a = Fraction(1,4)
b = Fraction(3,4)
c = a + b # c is a Fraction object
print(c)
print(float(c))
print(Fraction.__float__(c))
print(float(b.inverse()))
##c = Fraction(3.14, 2.7) # assertion error
##print a*b # error, did not define how to multiply two Fraction objects
16/16
1.0
1.0
1.3333333333333333
以下是一些簡單的出錯資訊解釋。
c = Fraction(3.14, 2.7)
#assertion error,__init__()要求輸入必須是整型。
print a*b
#error, did not define how to multiply two Fraction objects,沒有定義兩個Fraction object如何相乘
len(a)
#object of type 'Fraction' has no len()。Fraction類中沒有定義len()。
完整程式碼如下,版權歸MIT 公開課MIT的公開課《Introduction to Computer Science and Programming in Python》所有。
#################
## EXAMPLE: simple class to represent fractions
## Try adding more built-in operations like multiply, divide
### Try adding a reduce method to reduce the fraction (use gcd)
#################
class Fraction(object):
"""
A number represented as a fraction
"""
def __init__(self, num, denom):
""" num and denom are integers """
assert type(num) == int and type(denom) == int, "ints not used"
self.num = num
self.denom = denom
def __str__(self):
""" Retunrs a string representation of self """
return str(self.num) + "/" + str(self.denom)
def __add__(self, other):
""" Returns a new fraction representing the addition """
top = self.num*other.denom + self.denom*other.num
bott = self.denom*other.denom
return Fraction(top, bott)
def __sub__(self, other):
""" Returns a new fraction representing the subtraction """
top = self.num*other.denom - self.denom*other.num
bott = self.denom*other.denom
return Fraction(top, bott)
def __float__(self):
""" Returns a float value of the fraction """
return self.num/self.denom
def inverse(self):
""" Returns a new fraction representing 1/self """
return Fraction(self.denom, self.num)
相關文章
- PROG2004 Object Oriented ProgrammingObject
- COMP2011J - Object Oriented ProgrammingObject
- Object oriented design (OOD)Object
- OOP物件導向程式設計(Object-Oriented Programming)概述OOP物件程式設計Object
- Object與Class的關係Object
- Object-hashCode演算法筆記Object演算法筆記
- Scala進階(1)—— 反射 object 和 class反射Object
- rust-quiz:010-shadowed-trait-object-method.rsRustUIAIObject
- Java 中 instanceof 關鍵字 object instanceof ClassJavaObject
- Java如何將Object轉換成指定Class物件JavaObject物件
- Multi-Agent Oriented Programming PDF Download
- Object要點記錄Object
- JDK原始碼閱讀:Object類閱讀筆記JDK原始碼Object筆記
- 《BASNet:Boundary-Aware Salient Object Detection》論文筆記Object筆記
- ES7 Object.keys,Object.values,Object.entriesObject
- ObjectObject
- 論文筆記 Deep Patch Learning for Weakly Supervised Object Classication and Discovery筆記Object
- JDK1.8原始碼閱讀筆記(1)Object類JDK原始碼筆記Object
- 介面返回[object,Object]解決方法Object
- TypeError: Cannot read private member xxx from an object whose class did not declare itErrorObject
- Blind Return Oriented Programming (BROP) Attack - 攻擊原理
- 面向切面程式設計 ( Aspect Oriented Programming with Spring )程式設計Spring
- MXRuntimeUtils,替代 [NSObject performSelector object object ]的工具ObjectperformSelector
- 《Cascade R-CNN: Delving into High Quality Object Detection》論文筆記CNNObject筆記
- object類Object
- Object流Object
- Non-static method 'save(java.long.Object)' cannot be referenced from a static context.JavaObjectContext
- Object o = new Object()佔多少個位元組?-物件的記憶體佈局Object物件記憶體
- Object.seal()與Object.freeze()區別Object
- iOS底層原理 runtime-object_class拾遺基礎篇--(6)iOSObject
- object.assignObject
- Dictionary<string, object>Object
- Iterable object of JavaScriptObjectJavaScript
- Object.is()與'==='Object
- Object Runtime -- WeakObject
- Object.getOwnPropertyNames()Object
- Object.getPrototypeOf()Object
- Object.freeze()Object