Python 02,,@property装
Python 02,,@property装
@property装饰器虽然我们不 建议将属性设置为私有的,但是如果直接将属性暴露给外界也是有问题的,比如我们没有办法检查赋给属性的值是否有效。我们之前的建议是将属性命名以单下划线开头,通过这种方式来暗示属性是受保护的,不建议外界直接访问,那么如果想访问属性可以通过属性的getter(访问器)和setter(修改器)方法进行对应的操作。如果要做到这点,就可以考虑使用@property包装器来包装getter和setter方法,使得对属性的访问既安全又方便,代码如下所示。
使用装饰器的时候,需要注意: 1.装饰器名,函数名需要一致。 2.property需要先声明,在写setter,顺序不能倒过来。 3.如果你希望变量只是被访问而不能被修改,那么可以使用访问器@property 4.如果你要修改访问器中的变量,可以搭建一个修改器,或删除访问器。 class Person(object): def __init__(self,name,age): self._name = name self._age = age 访问器 ——getter方法 @property def __init__(self): return self._name 访问器——getter方法 @property def age(self): return self._age # 修改器 - setter方法 @age.setter def age(self, age): self._age = age def play(self): if self._age <= 16: print(‘%s正在玩飞行棋.‘ % self._name) else: print(‘%s正在玩斗地主.‘ % self._name)
slots魔法
我们讲到这里,不知道大家是否已经意识到,Python是一门动态语言。通常,动态语言允许我们在程序运行时给对象绑定新的属性或方法,当然也可以对已经绑定的属性和方法进行解绑定。但是如果我们需要限定自定义类型的对象只能绑定某些属性,可以通过在类中定义slots变量来进行限定。需要注意的是slots的限定只对当前类的对象生效,对子类并不起任何作用。
class Person(object):
# 限定Person对象只能绑定_name, _age和_gender属性 __slots__ = (‘_name‘, ‘_age‘, ‘_gender‘) def __init__(self, name, age): self._name = name self._age = age @property def name(self): return self._name @property def age(self): return self._age @age.setter def age(self, age): self._age = age def play(self): if self._age <= 16: print(‘%s正在玩飞行棋.‘ % self._name) else: print(‘%s正在玩斗地主.‘ % self._name) def main(): person = Person(‘王大锤‘, 22) person.play() person._gender = ‘男‘ # AttributeError: ‘Person‘ object has no attribute ‘_is_gay‘ # person._is_gay = True
占位符说明%s字符串(采用str()的显示)%r字符串(采用repr()的显示)%c单个字符%b二进制整数%d十进制整数%i十进制整数%o八进制整数%x十六进制整数%e指数 (基底写为e)%E指数 (基底写为E)%f浮点数%F浮点数,与上相同%g指数(e)或浮点数 (根据显示长度)%G指数(E)或浮点数 (根据显示长度)
%s字符串(采用str()的显示) %r字符串(采用repr()的显示) %c单个字符 %b二进制整数 %d十进制整数 %i十进制整数 %o八进制整数 %x十六进制整数 %e指数 (基底写为e) %E指数 (基底写为E) %f浮点数 %F浮点数,与上相同 %g指数(e)或浮点数 (根据显示长度) %G指数(E)或浮点数 (根据显示长度)
圆的面积 import mat width = float(input(‘请输入长方形的宽: ‘)) length = float(input(‘请输入长方形的长: ‘)) perimeter = 2*(width+length) area = width*length print(‘周长: %.2f‘ % perimeter) print(‘面积: %.2f‘ % area)注册代码 class Regist(object): def account(self): email = input(‘请输入邮箱:>>‘) print(‘ 您输入的邮箱是: %s‘ % email) self.password() def password(self): for _ in range(4): password_1 = input(‘请输入您的密码:>>‘) password_2 = input(‘请输入确认密码:>>‘) if password_1 == password_2: print(‘密码确认成功‘) self.verfily() break else: print(‘两次密码不一致‘) else: print(‘您可能是一个机器人滚‘) def verfily(self): for _ in range(3): import random number = random.randrange(1000,9999) print(‘验证码是: %d‘%number) number_2 = input(‘输入验证码:>>‘) if number == int(number_2): print(‘注册成功‘) break else: print(‘验证码错误‘) else: print(‘机器人‘) def main(): regist = Regist() regist.account() main()
Python 02
评论关闭