Python 中屬性和特性有什麼區別?
在 Python 中,一切皆為物件。每個物件都有屬性和方法或函式。屬性由資料變數描述,例如姓名、年齡、身高等。
特性是一種特殊的屬性,它具有 getter、setter 和 deleter 方法,例如 __get__、__set__ 和 __delete__ 方法。
Python 中的屬性裝飾器為屬性提供了 getter/setter 訪問。您可以使用 property 函式定義 getter、setter 和 deleter 方法。如果您只需要讀取屬性,也可以在方法上方新增 @property 裝飾器。
# create a class class C(object): # constructor def __init__(self, x): self._x = x # getting the values @property def x(self): #I'm the 'x' property. print('Getting x') return self._x # C._x is a property. This is the getter method # setting the values @x.setter #This is a setter method def x(self, x): print('Setting value to ' + x) self._x = x # deleting the values @x.deleter def x(self): print('Deleting x') del self._x # create an object of class y = C('Happy Holidays') print(y.x) #setting the value y.x = 'Merry Christmas!' # deleting the value del y.x
輸出
Getting x Happy Holidays Setting value to Merry Christmas! Deleting x
在 Python 中,物件既有屬性也有特性。這兩個概念可能令人困惑,因為它們相關但並不完全相同。
屬性
屬性是屬於物件的可變資料。可以使用點表示法訪問它們,通常在物件的類定義中定義。
示例
在這個示例中,我們定義了一個名為 `Dog` 的類,它有兩個屬性:`name` 和 `age`。然後,我們建立一個名為 `my_dog` 的 `Dog` 物件,並將其 `name` 和 `age` 屬性分別設定為 "Fido" 和 3。最後,我們列印 `name` 屬性的值,即 "Fido"。
class Dog: def __init__(self, name, age): self.name = name self.age = age my_dog = Dog("Fido", 3) print(my_dog.name)
輸出
Fido
特性
另一方面,特性是用於訪問或修改屬性值的方法。它們使用 `@property` 裝飾器定義,可以認為是 "getter" 方法。
示例
在這個示例中,我們定義了一個名為 `Square` 的類,它有一個名為 `side` 的屬性。我們還定義了一個名為 `area` 的特性,它根據邊長計算正方形的面積。我們建立一個名為 `my_square` 的 `Square` 物件,邊長為 5,並列印其面積,即 25。
class Square: def __init__(self, side): self.side = side @property def area(self): return self.side ** 2 my_square = Square(5) print(my_square.area)
輸出
25
需要注意的是,特性與屬性不同,因為它們是用於訪問或修改屬性的方法。在上面的示例中,`area` 不是 `my_square` 的屬性,而是一個根據 `side` 屬性計算值的特性。
Python 中的屬性與特性
讓我們看一些更多的程式碼示例,以便更好地理解屬性和特性之間的區別。
示例:屬性與特性示例
在這個示例中,我們定義了一個名為 `BankAccount` 的類,它有兩個屬性:`balance` 和 `interest_rate`。我們還定義了一個名為 `interest_earned` 的特性,它根據賬戶餘額和利率計算賬戶獲得的利息。我們建立一個名為 `acct1` 的 `BankAccount` 物件,餘額為 1000,利率為 0.05,然後使用點表示法列印其餘額和獲得的利息。
class BankAccount: def __init__(self, balance, interest_rate): self.balance = balance self.interest_rate = interest_rate @property def interest_earned(self): return self.balance * self.interest_rate acct1 = BankAccount(1000, 0.05) print(acct1.balance) print(acct1.interest_earned)
輸出
1000 50.0
在這個示例中,`balance` 和 `interest_rate` 是 `BankAccount` 物件 `acct1` 的屬性。`interest_earned` 是一個根據物件屬性計算值的特性。它使用 `@property` 裝飾器定義,可以使用點表示法訪問。
總的來說,Python 中屬性和特性之間的區別在於,屬性只是物件的成員資料,而特性是像屬性一樣訪問的方法,但在被呼叫時實際上會執行一些計算。
示例
以下是一個示例,演示了在表示矩形的類中使用屬性和特性的方法 -
class Rectangle: def __init__(self, width, height): self.width = width self.height = height @property def area(self): return self.width * self.height @property def perimeter(self): return 2 * (self.width + self.height) rect = Rectangle(5, 3) print(rect.width) print(rect.height) print(rect.area) print(rect.perimeter)
輸出
5 3 15 16
在這個示例中,`width` 和 `height` 是 `Rectangle` 物件 `rect` 的屬性。`area` 和 `perimeter` 是根據其屬性計算矩形面積和周長的特性。這兩個特性都使用 `@property` 裝飾器定義,可以使用點表示法訪問。
示例
以下是一個示例,演示了在表示人的類中使用屬性和特性的方法 -
class Person: def __init__(self, name, age): self.name = name self.age = age @property def is_minor(self): return self.age < 18 @property def is_adult(self): return self.age >= 18 person1 = Person("Alice", 23) person2 = Person("Bob", 16) print(person1.name) print(person1.age) print(person1.is_minor) print(person1.is_adult) print(person2.name) print(person2.age) print(person2.is_minor) print(person2.is_adult)
輸出
Alice 23 False True Bob 16 True False
在這個示例中,`name` 和 `age` 是 `Person` 物件 `person1` 和 `person2` 的屬性。`is_minor` 和 `is_adult` 是根據年齡檢查一個人是否未成年或成年的特性。這兩個特性都使用 `@property` 裝飾器定義,可以使用點表示法訪問。