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`裝飾器定義,可以使用點表示法訪問。
資料結構
網路
關係資料庫管理系統(RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP