python之@property(23)【动态更新补充python元类】

#
# @File  :
# @Author: dianxiaoer
# @Date  : 2019/11/6
# @Desc  :

# @property属性
# 在绑定属性时候,如果直接把属性暴露出来,虽然操作简单,但是缺少检查参数的步骤,导致参数可以随便修改
# 代码如下:
# class Student(object):
#
#     def get_score(self):
#          return self._score
#
#     def set_score(self, value):
#         if not isinstance(value, int):
#             raise ValueError('score must be an integer!')
#         if value < 0 or value > 100:
#             raise ValueError('score must between 0 ~ 100!')
#         self._score = value
#
#
# s = Student()
# s.set_score(100)
# print(s.get_score())

# 但是,以上方法略显复杂,没有直接用属性简单直接;
# 有没有既能检查参数,又可以用类似属性这样简单的方式来访问类的变量呢?对于追求完美的Python程序员来说,这是必须要做到的!【摘自网上一篇博文】
# 装饰器(decorator)可以给函数动态加上功能,对于类的方法,装饰器依然起作用;
# python内置的@property就是负责把一个方法变成属性调用的;

# class Student(object):
#
#     @property
#     def score(self):
#         return self._score
#
#     @score.setter
#     def score(self, value):
#         if not isinstance(value, int):
#             raise ValueError('score must be an integer!')
#         if value < 0 or value > 100:
#             raise ValueError('score must between 0 ~ 100!')
#         self._score = value
#
# s = Student()
# # s.score = "python"
# # print(s.score)
# s.score = 100
# print(s.score)


# 把一个getter方法变成属性,只需要加上@property就可以了,此时,@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值,于是,我们就拥有一个可控的属性操作;

# class Student(object):
#
#     @property
#     def birth(self):
#         return self._birth
#
#     @birth.setter
#     def birth(self, value):
#         self._birth = value
#
#     @property
#     def age(self):
#         return 2019 - self._birth
#
#
# s = Student()
# s.birth = 1998
# print(s.birth())

# class ItemMeatClass(type):
#     def __new__(cls, name,bases,attrs):
#         attrs['cal_price'] = lambda self : self.price * self.discount
#         return type.__new__(cls,name,bases,attrs)
#
# class Book(metaclass=ItemMeatClass):
#     __slots__ = ('name','price','discount')
#     def __init__(self,name,price):
#         self.name = name
#         self.price = price
#
#         @property
#         def discount(self):
#             return self._discount
#         @discount.setter
#         def discount(self,discount):
#             self._discount = discount
#
#
# class CellPhone(metaclass=ItemMeatClass):
#     __slots__ = ('price','_discount')
#     def __init__(self,price):
#         self.price = price
#
#     @property
#     def discount(self):
#         return self._discount
#
#     @discount.setter
#     def discount(self,discount):
#         self._discount = discount
#
# b = Book("python",89)
# b.discount = 0.5
# print(b.cal_price())
# print("$"*10)
# cp = CellPhone(8888)
# cp.discount = 0.9
# print(cp.cal_price())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值