属性(Attribute)是Python对象数据的存取方式,通常我们可以直接通过实例化后的对象对其属性进行获取或修改,例如:
class Car:
def __init__(self, brand, color, price):
self.brand = brand
self.color = color
self.price = price
my_car = Car('BMW', 'Black', 100000)
print(my_car.color) # 输出 "Black"
在上述代码中,我们创建了一个汽车类Car,其属性包括品牌,颜色,价格,然后实例化一个对象my_car,并调用其颜色属性,输出 "Black"。
在Python中,我们也可以通过@property方法来实现对属性的存取。例如:
class Car:
def __init__(self, brand, color, price):
self.__brand = brand
self.__color = color
self.__price = price
@property
def color(self):
return self.__color
@color.setter
def color(self, value):
if value != 'Green':
self.__color = value
else:
raise ValueError("Green is not allowed")
my_car = Car('BMW', 'Black', 100000)
print(my_car.color) # 输出 "Black"
my_car.color = 'Blue'
print(my_car.color) # 输出 "Blue"
my_car.color = 'Green'
# 抛出 ValueError 异常,输出 "Green is not allowed"
在上述代码中,我们在声明颜色属性时候使用了@property装饰器,然后又通过定义“属性名.setter”方法实现对属性的修改,并添加异常处理逻辑。在调用实例的属性操作时,可以像普通属性一样调用。
使用属性与@property装饰器有助于我们提高Python代码的可读性和可维护性,尤其是在涉及到一些校验和逻辑处理的时候,更能体现出Python的灵活和易用性。
示例1:使用属性与@property装饰器的字符长度校验示例
class User:
def __init__(self, name, password):
self.__name = name
self.__password = password
@property
def password(self):
return self.__password
@password.setter
def password(self, value):
if len(value) < 6:
raise ValueError("Password length should be longer than 6 characters")
else:
self.__password = value
my_user = User('Tom', '123456')
my_user.password = 'pass' # 抛出 ValueError 异常,输出 "Password length should be longer than 6 characters"
在上述代码中,我们定义了一个名为User的类,其中定义了一个密码属性,并设置了通过@property装饰器返回其密码属性,在定义“密码属性名.setter”方法实现了密码长度校验逻辑。
示例2:使用属性与@property装饰器的时间格式化和校验示例
from datetime import datetime
class Post:
def __init__(self, title, content):
self.__title = title
self.__content = content
self.__time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
@property
def time(self):
return self.__time
@time.setter
def time(self, value):
try:
datetime.strptime(value, '%Y-%m-%d %H:%M:%S')
self.__time = value
except:
raise ValueError("Time format is not correct, should be YYYY-MM-DD HH:MM:SS")
my_post = Post('Hello world', 'This is my first python post')
print(my_post.time) # 输出当前时间格式化后的字符串
my_post.time = '2021-08-01 09:00:00'
print(my_post.time) # 输出 "2021-08-01 09:00:00"
my_post.time = '2021/08/01 09:00:00'
# 抛出 ValueError 异常,输出 "Time format is not correct, should be YYYY-MM-DD HH:MM:SS"
在上述代码中,我们定义了一个名为Post的类,其中定义了一个时间属性,并设置了通过@property装饰器返回在初始化时设置的时间格式化字符串,在定义“属性名.setter”方法实现了时间格式化和校验逻辑。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:属性与 @property 方法让你的python更高效 - Python技术站