python 访问属性和属性装饰器
来源:互联网 发布:死侍蜘蛛侠 知乎 编辑:程序博客网 时间:2024/04/23 17:24
十四、python 访问属性和属性装饰器
访问属性:
1、直接访问(上一讲得直接操作)
2、通过自定义get()、 set()方法来访问
3、通过属性装饰器
@property 读
@***.setter 写
@***.deleter 删除
4、通过属性符访问
代码重用
描述符属性必须定义为类属性
-----------------------------------------------------------
#属性访问
class Chinese(object):
nation = 'Chain'
def __init__(self, id, name):
self._id = id
self.__name = name
self.__mail = None
def sayHi(self, msg):
print self.__name,msg
#自定义get、 set方法访问
def getId(self):
return self._id
def setId(self, id):
self._id = id
# 定义属性装饰器
@property
def name(self):
return self.__name
@name.setter
def name(self, name):
self.__name = name
@name.deleter
def name(self):
del self.__name
#定义实例
aidon = Chinese(1,'aidon')
print aidon.getId()
aidon.setId(10)
print aidon.getId()
print aidon.name
aidon.name = 'bajie'
print aidon.name
del aidon.name #删除
#print aidon.name
print aidon._Chinese__mail
print aidon.__dict__
--------------------------------------------------------------
---------------------------------------------------------------
#类描述符定义
class Property(object):
def __init__(self, propname, datatype, default=None):
self._name = '_'+propname+'_'
self._type = datatype
self._default = default if default else self._type()
def __get__(self, instance, owner):
return getattr(instance,self._name,self._default)
def __set__(self, instance, value):
if not isinstance(value,self._type):
raise TypeError('Type Error,must be %s type0' % self._type)
setattr(instance,self._name,value)
def __del__(self):
pass
class Email(Property):
def __init__(self,propname,default=None):
super(Email,self).__init__(propname,str,default)
def __set__(self, instance, value):
if not isinstance(value,self._type):
raise TypeError('Type Error,must be %s type0' % self._type)
if not '@' in value:
raise ValueError('Email address is not valid')
setattr(instance,self._name,value)
class Chinese(object):
Id = Property('id', int) #描述符必须是类属性,Id随便定义,和后面没有任何关系,它相当于对外访问提供的一个接口
Name = Property('name', str)
Email = Email('email')
#注意:类的成员方法中,也必须使用类的描述符
def __init__(self,id,name,email):
self.Id = id
self.Name = name
self.Email = email
#---------使用交互式测试--------------------
aidon = Chinese()
aidon.__dict__
aidon.Id #此时都是默认类型的默认值才对
aidon.Name
aidon.Email
#赋值
aidon.Id= 100
aidon.Name = 'aidon'
aidon.Email = 'abc@163.com'
aidon.Id
aidon.__dict__
#设置和类型不匹配的值
aidon.Name = 123123
aidon.Email = 'abc'
#测试类的成员方法
bajie = Chinese(1,'bajie','bj@163.com')
bajie.Name
bajie.__dict__
-----------------------------------------------------------------
- python 访问属性和属性装饰器
- Python:高级主题之(属性取值和赋值过程、属性描述符、装饰器)
- ECMAScript数据属性和访问器属性
- 数据属性和访问器属性
- python之Class属性定义和访问
- python属性和方法的访问
- js属性类型(数据属性和访问器属性)
- Python - 属性访问
- PYTHON属性访问
- Python访问私有属性
- python属性访问
- Python:使用property装饰器将方法转为属性
- python-实现属性可修改的函数装饰器-28
- 一个程序理解python的类属性和实例属性(共有属性和私有属性的访问区别)
- 访问和继承属性
- JavaScript笔记--数据属性和访问器属性
- JavaScript笔记--数据属性和访问器属性
- JS中的克隆与数据属性和访问器属性
- 面试运维
- iptables: No config file. [WARNING]!
- nodejs-socket网络编程
- 关于在Aptana Studio中编写js效果在浏览器中的刷新问题,光标变黑色矩形问题
- 利用Frida从TeamViewer内存中提取密码
- python 访问属性和属性装饰器
- python运算符
- Leetcode206. Reverse Linked List总结
- Java使用poi包读取Excel文档
- POJ
- python 方法、实例方法、静态方法、类方法
- 【Python3.6爬虫学习记录】(八)Selenium模拟登录新浪邮箱并发送邮件
- [Java基础]Java接口
- 原型模式