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` 装饰器定义,可以使用点表示法访问。

更新于: 2023年5月8日

6K+ 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告