Python 浅淡python中的属性(property)
1. 引言
在Python中,属性是对象的特性,用于存储数据。但有时候我们希望能够对属性进行一些额外的操作,比如验证输入值、计算属性值等。为了实现这些额外的操作,Python提供了属性(property)的概念。在本篇文章中,我们将深入探讨Python中属性的概念、用法和一些常见的应用场景。
2. python属性的概念
在Python中,属性是一个特性,它与对象的状态有关。属性可以分为两种类型:实例属性和类属性。
2.1 实例属性
实例属性是属于一个具体对象的特性。每个对象都可以拥有不同的实例属性。通过构造函数或在对象实例中动态绑定属性的方式来实现。
示例代码如下:
class Person:
def __init__(self, name):
self.name = name
p1 = Person("Alice")
p2 = Person("Bob")
在上述示例代码中,name
是Person
类的一个实例属性。每个实例对象都可以通过.name
来访问自己的name
属性。
2.2 类属性
类属性是属于一个类的特性。它被所有的实例共享,即类属性在内存中只有一份拷贝。通常情况下,在类的外部通过类名直接访问。
示例代码如下:
class Circle:
PI = 3.14
def __init__(self, radius):
self.radius = radius
def area(self):
return self.PI * self.radius * self.radius
c = Circle(5)
print(c.area()) # 输出: 78.5
print(Circle.PI) # 输出: 3.14
在上述示例代码中,PI
是Circle
类的一个类属性,它被所有的Circle
实例共享。可以通过Circle.PI
来访问。
3. 属性的操作方法
在Python中,可以通过以下两种方法来定义和操作属性:使用装饰器或者使用property
函数。
3.1 使用装饰器
在Python中,使用@property
装饰器可以将一个类方法转换为只读属性,可以通过属性名直接访问。
示例代码如下:
class Circle:
def __init__(self, radius):
self.radius = radius
@property
def area(self):
return 3.14 * self.radius * self.radius
c = Circle(5)
print(c.area) # 输出: 78.5
在上述示例代码中,area
方法被装饰为属性方法,可以直接通过c.area
来访问。
3.2 使用property
函数
property
函数返回属性的值,并且可以定义获取、设置和删除属性的方法。可以使用property
函数来实现属性的读写和验证操作。
示例代码如下:
class Person:
def __init__(self, name):
self._name = name
def get_name(self):
print("Getting name...")
return self._name
def set_name(self, value):
print("Setting name...")
self._name = value
def del_name(self):
print("Deleting name...")
del self._name
name = property(get_name, set_name, del_name)
p = Person("Alice")
print(p.name) # 输出: Getting name... Alice
p.name = "Bob" # 输出: Setting name...
print(p.name) # 输出: Getting name... Bob
del p.name # 输出: Deleting name...
在上述示例代码中,name
属性使用property
函数定义了获取、设置和删除方法,可以通过p.name
来访问、设置和删除。
4. 属性的应用场景
属性(property)在Python中有许多应用场景,下面我们将介绍三个常见的应用场景。
4.1 验证输入值
通过定义属性的设置方法,可以对输入值进行验证,确保其符合一定的规则。
示例代码如下:
class Circle:
def __init__(self, radius):
self._radius = radius
@property
def radius(self):
return self._radius
@radius.setter
def radius(self, value):
if value > 0:
self._radius = value
else:
raise ValueError("Radius must be positive.")
c = Circle(5)
print(c.radius) # 输出: 5
c.radius = 10
print(c.radius) # 输出: 10
c.radius = -5 # 输出: ValueError: Radius must be positive.
在上述示例代码中,radius
属性的设置方法进行了数值的验证,确保输入的半径值大于0。
4.2 计算属性值
通过定义属性的获取方法,可以根据其他属性的值动态计算属性的值。
示例代码如下:
class Rectangle:
def __init__(self, width, height):
self._width = width
self._height = height
@property
def width(self):
return self._width
@property
def height(self):
return self._height
@property
def area(self):
return self._width * self._height
r = Rectangle(5, 10)
print(r.area) # 输出: 50
r.width = 10 # AttributeError: can't set attribute
在上述示例代码中,area
属性的获取方法根据width
和height
属性的值动态计算面积。
4.3 控制属性访问权限
通过定义属性的获取和设置方法,可以控制属性的访问权限,确保属性的安全性。
示例代码如下:
class BankAccount:
def __init__(self, balance):
self._balance = balance
@property
def balance(self):
return self._balance
@balance.setter
def balance(self, value):
if value >= 0:
self._balance = value
else:
raise ValueError("Balance cannot be negative.")
account = BankAccount(1000)
print(account.balance) # 输出: 1000
account.balance = 2000
print(account.balance) # 输出: 2000
account.balance = -1000 # 输出: ValueError: Balance cannot be negative.
在上述示例代码中,通过定义balance
属性的设置方法,确保账户余额不能为负数。
5. 结论
属性(property)是Python中的一个重要概念,可以通过装饰器或property
函数来定义和操作属性。属性有助于我们对属性进行验证、计算和控制访问权限。掌握了属性的用法和应用场景,可以使我们的代码更加清晰和易于维护。