网站可以制作ios怎么做微信里的网页网站链接
web/
2025/9/26 15:13:21/
文章来源:
网站可以制作ios,怎么做微信里的网页网站链接,怎么查个人名下是否注册公司,域名注册需要资料前言#xff1a;
在Python中#xff0c;property 是一种内置的装饰器#xff0c;它可以将类的方法转换为属性#xff0c;让你在不改变类接口的情况下添加额外的逻辑#xff0c;如输入值的验证、取值的计算等。property 可以作为一种方式让你的类接口保持清晰且易于使用。…前言
在Python中property 是一种内置的装饰器它可以将类的方法转换为属性让你在不改变类接口的情况下添加额外的逻辑如输入值的验证、取值的计算等。property 可以作为一种方式让你的类接口保持清晰且易于使用。 property 装饰器最常见的应用场景是将类的属性封装起来提供getter 和 setter 方法。这种方式的原因是你可以对属性赋值或者取值的代码进行控制而不是直接暴露属性。 property 通常会按照下面这样的模式使用 property 装饰一个方法定义属性名该方法为属性的 “getter” 方法。 property_name.setter 装饰一个方法将其定义为同名属性的 “setter” 方法。 property_name.deleter 装饰一个方法将其定义为同名属性的 “deleter” 方法。
1 应用场景
1.1 数据封装与保护
#!/usr/bin/env python
# codingutf-8# Time : 2024/4/12 23:00
# Author : Summer
# File : property_test.py
# describe:
class BankAccount:def __init__(self, initial_balance0.0):self._balance initial_balance # 初始化时将_balance设为初识余额propertydef balance(self):获取账户余额。return self._balancebalance.setterdef balance(self, value):设置账户余额拒绝直接设置。raise ValueError(Cannot directly set balance; please use deposit() or withdraw() methods.)def deposit(self, amount):存款方法只有金额是正数时才接受该交易。if amount 0:raise ValueError(Deposit amount must be positive.)self._balance amountdef withdraw(self, amount):取款方法只有余额充足且金额是正数时才接受该交易。if amount 0:raise ValueError(Withdrawal amount must be positive.)if amount self._balance:raise ValueError(Insufficient balance.)self._balance - amount# 使用
account BankAccount(1000) # 初始余额为1000
print(account.balance) # 输出余额account.deposit(500) # 存款500
print(account.balance) # 输出新余额try:account.balance 1500 # 尝试直接设置余额将引发异常
except ValueError as e:print(e)account.withdraw(200) # 取款200
print(account.balance) # 输出新余额try:account.withdraw(2000) # 尝试取款超过余额的金额将引发异常
except ValueError as e:print(e)
在这个例子中BankAccount类有一个私有属性_balance这意味着我们不想让外部直接修改它。我们提供了一个balance属性的getter来获取余额但我们故意没有提供setter去允许直接修改余额反而提供了deposit和withdraw方法来合理地修改余额。 当尝试直接设置account.balance时由于没有适当的setterproperty装饰器会引发一个ValueError异常。而当通过deposit和withdraw方法修改余额时可以在方法内部加入一定的验证逻辑比如只接受正数金额以及在取款时确保余额充足等。 通过这种方式我们可以确保账户余额不会被非法修改并且所有余额的变化都是通过安全的方法进行的。这就是使用property装饰器进行数据封装和保护的一个典型例子。
1.2 属性计算与逻辑处理
#!/usr/bin/env python
# codingutf-8# Time : 2024/4/12 23:00
# Author : Summer
# File : property_test.py
# describe:
class Rectangle:def __init__(self, width, height):self.width widthself.height heightpropertydef area(self):计算矩形的面积。return self.width * self.heightpropertydef perimeter(self):计算矩形的周长。return 2 * (self.width self.height)def resize(self, new_width, new_height):修改矩形的尺寸并自动更新计算属性。if new_width 0 or new_height 0:raise ValueError(Width and height must be positive.)self.width new_widthself.height new_height# 使用
rectangle Rectangle(3, 4)
print(rectangle.area) # 输出面积12
print(rectangle.perimeter) # 输出周长14rectangle.resize(5, 6)
print(rectangle.area) # 输出新面积30
print(rectangle.perimeter) # 输出新周长22try:rectangle.resize(-3, 6)
except ValueError as e:print(e) # 尺寸必须为正数否则抛出异常
在这个例子中Rectangle类有width和height两个属性以及两个由这两个属性计算得出的只读属性area和perimeter。area属性返回矩形的面积perimeter属性返回矩形的周长。这两个属性都没有setter方法因为它们取决于width和height的值而不是直接设置的。 此外如果需要修改矩形的尺寸我们定义了一个名为resize的方法来同时更新width和height。这时由于area和perimeter的计算依赖于这两个属性它们也会自动更新因此我们无需手动同步这些计算属性。 通过使用property我们可以将计算和逻辑封装在类内部使得外部接口简洁并易于使用同时保持内部数据的一致性。这也使得我们能够在未来改变计算属性的内部实现而不影响调用方的代码。
1.3 高级getter和setter用法
#!/usr/bin/env python
# codingutf-8# Time : 2024/4/12 23:00
# Author : Summer
# File : property_test.py
# describe:
使用property装饰器来定义属性的getter和setter方法并使用name.setter和price.setter来分别定义name和price属性的setter方法。在setter方法中我们检查传入的值的类型和值是否满足要求如果满足要求则将值赋给对应的属性否则引发异常。
class Product:def __init__(self, name, price):self.name nameself.price pricepropertydef name(self):return self._namename.setterdef name(self, value):if not isinstance(value, str):raise TypeError(Name must be a string)if not value.strip():raise ValueError(Name cannot be empty)self._name valuepropertydef price(self):return self._priceprice.setterdef price(self, value):if not isinstance(value, (int, float)):raise TypeError(Price must be a number)if value 0:raise ValueError(Price must be positive)self._price round(value, 2) # 注意在此处我们将价格四舍五入到两位小数# 使用
product Product(Coffee, 3.99)
print(product.name) # 输出商品名称
print(product.price) # 输出商品价格try:product.name # 尝试设置一个空的商品名称将引发异常
except ValueError as e:print(e)try:product.price Free # 尝试设置一个非数字的价格将引发异常
except TypeError as e:print(e)product.price 5.98765 # 此时会自动四舍五入价格
print(product.price)在这个例子中Product类有两个属性name和price。每个属性都有一个getter和setter而setter方法中包含了输入的验证和转换。 对于name属性setter方法确保传入的值是字符串并且非空 对于price属性setter方法检查值是否是一个正数 (可以是整数或浮点数) 并且将其四舍五入到两位小数。 这些额外的验证确保了 商品名称不为空且为文本类型。 商品价格总是正数并且为了表示金钱它总是以两位小数显示。 通过在setter中包含这些逻辑我们可以确保Product类的实例始终维持在有效和合理的状态。如果尝试为这些属性赋值无效的数据类会引发异常阻止这样做并且可以为异常处理提供更多上下文。这种模式帮助保持数据的完整性并可以在属性被错误地设置时立即发现问题。
使用property的好处
property() 函数是 Python 中用于创建可管理属性的重要工具它可以实现数据封装、访问控制、属性计算等功能。 封装property允许开发者隐藏封装内部实现的细节提供一个干净的API。内部变量往往以下划线如_variable或__variable作为前缀命名表示它们不应直接访问。 数据验证通过使用setter方法开发者可以轻松加入数据验证逻辑确保类的状态总是有效的。例如可以检查属性值是否在预期范围内或者是否是正确的类型。 计算属性有些属性的值是基于对象的状态计算得到的。使用getter方法可以轻松地根据其他属性动态生成这些值。这些属性通常被认为是只读属性。 延迟计算和缓存惰性计算对于计算成本较高的属性值可以在首次访问时进行计算并缓存结果而不是在对象创建时就计算。这样做可以提高性能尤其是在该属性不一定会被每个对象使用的情况下。 观察者模式通过使用property装饰器的setter方法可以在一个属性被修改时触发某些额外的操作例如日志记录、通知或是其它形式的状态同步。 保持向后兼容性如果你的类曾经公开了一个属性并且你想添加一些对其访问控制而不破坏现有代码那么你可以将它转变为一个用property装饰器实现的方法这样做不需要修改对这个属性的引用。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/82252.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!