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)
相關文章
- COMP2011J - Object Oriented ProgrammingObject
- OOP物件導向程式設計(Object-Oriented Programming)概述OOP物件程式設計Object
- Object oriented design (OOD)Object
- Uncaught TypeError: Object [object Object] has no method 'xxx'ErrorObject
- Object C學習筆記18-SEL,@ selector,Class,@classObject筆記
- Uncaught TypeError: Object # has no method 'load'ErrorObject
- Object與Class的關係Object
- object is not an instance of declaring classObject
- Cannot decode object of class Employee for key (NS.object.0); the class may be defined in source cod...Object
- Object C學習筆記8-字串NSString之二Object筆記字串
- scala class和object的區別Object
- Scala進階(1)—— 反射 object 和 class反射Object
- object-c [self class] 和 [self _cmd]Object
- Object-hashCode演算法筆記Object演算法筆記
- Object C學習筆記12-集合Object筆記
- Object C學習筆記13-Dictionary字典Object筆記
- Object C學習筆記11-陣列Object筆記陣列
- Object C學習筆記21-typedef用法Object筆記
- Object C學習筆記22-#define 用法Object筆記
- Object C學習筆記19-列舉Object筆記
- Object C學習筆記4-記憶體管理Object筆記記憶體
- Java如何將Object轉換成指定Class物件JavaObject物件
- Object要點記錄Object
- JDK原始碼閱讀:Object類閱讀筆記JDK原始碼Object筆記
- Object C學習筆記9-字串NSMutableStringObject筆記字串
- Object C學習筆記15-協議(protocol)Object筆記協議Protocol
- Object C學習筆記16-委託(delegate)Object筆記
- Object C學習筆記20-結構體Object筆記結構體
- Object C學習筆記14-分類(category)Object筆記Go
- Object C學習筆記6-如何在Windows環境搭建Object C開發環境Object筆記Windows開發環境
- Java 中 instanceof 關鍵字 object instanceof ClassJavaObject
- ObjectObject
- JDK1.8原始碼閱讀筆記(1)Object類JDK原始碼筆記Object
- 《BASNet:Boundary-Aware Salient Object Detection》論文筆記Object筆記
- Object C學習筆記25-檔案管理(一)Object筆記
- Object C學習筆記26-檔案管理(二)Object筆記
- Qt筆記:QDate、QTextCodec、QFileDialog以及Q_OBJECTQT筆記Object
- iOS 如何實現 Aspect Oriented Programming (上)iOS