#
# @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())