Python對象的創建和賦值


創建類

類的定義以關鍵字class開頭,之后跟着一個名字(用戶定義)來標識這個類,並且以冒號結尾。類的內容以縮進(4個空格)表示,如下例的pass表示什么事情也不做。

Python命名規則(以字母或者下划線開頭,名字只能含有字母、下划線或者數字)。一般使用駝峰式命名(以大寫字母開頭,並且隨后緊跟的任意個單詞,這些單詞都要以大寫字母開頭)。

class MyFirstClass:
    pass

將上述的代碼保存為first_class.py文件,然后運行命令python -i first_class.py。參數-i表示在交互式解釋器運行這個腳本。

$ python -i first_class.py 
>>> a = MyFirstClass() >>> print(a)
<__main__.MyFirstClass object at 0x103fd7e80>
>>> b = MyFirstClass()
>>> print(b)
<__main__.MyFirstClass object at 0x103fd7eb8>

上述實例化了兩個對象a和b。鍵入類的名字並緊跟一對小括號。

添加屬性

可以通過點記法給一個實例化的對象賦予任意屬性點記法形式為<object>.<attribute> = <value>來為屬性賦值,這個值可以是任意的,如python內置的數據類型、其他的對象甚至是一個函數或者是另一個類。

class Point:
    pass

p1 = Point()
p2 = Point()

p1.x = 5
p1.y = 4

p2.x = 3
p2.y = 6

print(p1.x, p1.y)
print(p2.x, p2.y)

這段代碼創建了一個沒有任何數據和行為的Point 類。然后創建了這個Point類的兩個實例,並且給每個實例賦予一個x坐標和一個y坐標。運行如上的代碼會得到如下的結果。

5 4 
3 6

讓類實際做一些事情

上面我們已經可以讓一個對象帶有屬性,接下來是通過激發一些行為來引起這些屬性的變化。在Point類里面添加了一個reset方法,該方法是將點移到原點(該方法不需要用到參數,是個很好的例子)。

class Point:
    def reset(self):
        self.x = 0
        self.y = 0

p = Point()

p.x = 5
p.y = 4
print(p.x, p.y)
# 5 4

p.reset()
print(p.x, p.y)
# 0 0

python中的方法(method)定義和函數(function)基本相同,方法可以操作對象本身和任意傳入的參數。方法與函數不同的是,所有的方法都有一個必須的參數,這個參數通常被稱為self,若忘記,引用該方法時會出現報錯。一個方法中的self參數,是對調用這個方法的對象的一個引用,我們可以和其他對象一樣訪問這個對象的屬性和方法。當要改變self對象的x和y屬性值時,通過調用內部的reset方法實現。

當調用p.reset(),並沒有給它傳入self參數,python會自動將這個對象傳給了該方法

方法只是一個函數而已,只不過恰巧出現在類中。除了可以直接調用一個對象的方法以外,我們也可以在類中調用這個函數,並且明確可以將這個對象作為self參數傳給對象

class Point:
    def reset(self):
        self.x = 0
        self.y = 0

p = Point()
Point.reset(p) print(p.x, p.y)
# 0 0

如何傳遞多個參數?假設在Point類中,添加新的方法,可以將點移動到任意位置,而不只是原點。另外可以接受另一個Point對象作為輸入,然后返回這兩個對象之間的距離。

import math

class Point:
    def move(self, x, y):   # 接受x和y兩個參數,並且給self對象賦值
        self.x = x
        self.y = y

    def reset(self):  # 移動到特定位置的move
        self.move(0, 0)

# 接受另一個Point對象作為輸入,返回距離 
    def calculate_distance(self, other_point):  
        return math.sqrt(
                (self.x - other_point.x) ** 2 +
                (self.y - other_point.y) ** 2)

# 如何使用它
point1 = Point()
point2 = Point()

point1.reset()
point2.move(5, 0)
print(point2.calculate_distance(point1))
#5.0

#assert是一個簡單的測試工具,如果后面的語句是False(0,空或者None),這個程序會異常退出
assert(point2.calculate_distance(point1) == 
       point1.calculate_distance(point2))

point1.move(3, 4)
print(point1.calculate_distance(point2))
#4.472135955
print(point1.calculate_distance(point1))
#0.0 

 

參考:

1、《Python3 面向對象編程》 [加]Dusty Philips 著


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM