学习资源
本次学习目标
搞清楚Django的模型字段是如何实现的?
Django里常常有这样的代码:
class MyModel(models.Model):
name = models.CharField(verbose_name='姓名', max_length=10)
age = models.PositiveIntegerField(verbose_name='年龄')
像CharField
这样的模型字段赋值直接:
obj.name = '蛮三'
除此之外字段还有其他许多属性,像
obj.age = '法克鱿'
这样的语句是不允许的,在obj.save()
时会报错
这一点是怎么实现的呢?
学习主题
Python动态属性、描述符类
第一个例子
我要去买一斤苹果,已经知道要买的水果名称、价格还有数量,问我一共要付多少钱呢?如何用Python来实现?
答案:
class LineItem:
def __init__(self, goods, price, nums):
self.goods = goods
self.price = price
self.nums = nums
def subtotal(self):
return self.price * self.nums
goods = 'apple'
price = 18
nums = 1
item = LineItem(goods, price, nums)
print('顾客:我要{}斤{}'.format(nums, goods))
print('老板:好的,一共{}块钱'.format(item.subtotal()))
输出:
顾客:我要1斤apple
老板:好的,一共18块钱
你可能会发现,如果我把nums设置为负数,那老板倒要给我找钱了,为了维护老板的利益,我决定解决这个BUG,修改以上代码如下:
class LineItem:
def __init__(self, goods, price, nums):
self.goods = goods
self.price = price
self.nums = nums
@property
def price(self):
return self.__price
@price.setter