Python 属性和属性之间有什么区别
在Python中,一切都是对象。每个对象都有属性和方法或函数。属性由数据变量描述,例如名称、年龄、身高等。
属性 是一种特殊类型的属性,它具有getter、setter和delete方法,例如__get__
、__set__
和__delete__
方法。
Python中的属性装饰器为属性提供getter/setter访问。您可以使用property函数定义getter、setter和删除方法。如果您只想要只读属性,还可以在方法上方添加@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中,对象既有属性(attribute)又有特性(property)。这两个概念可能会让人感到混淆,因为它们之间有关联但并非完全相同的东西。
属性
属性是属于对象的变量。它们可以使用点号标记法(dot notation)进行访问,并且通常在对象的类定义内部进行定义。
示例
在这个示例中,我们定义了一个名为Dog
的类,它有两个属性:name
和age
。接下来,我们创建了一个名为my_dog
的Dog
对象,并将其name
属性设置为”Fido”、age
属性设置为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
的属性,它根据正方形的边长计算出正方形的面积。我们创建一个边长为5的Square
对象,打印其面积为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
是acct1
这个BankAccount
对象的属性。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
是person1
和person2
的Person
对象的属性。is_minor
和is_adult
是根据他们的年龄判断人是否为未成年人或成年人的属性。这两个属性都使用@property
装饰器定义,并可以使用点表示法访问。