__getattr__和__setattt__使用
# coding:utf-8
"""
__setattr__(self, name, value),如果要给name赋值,调用此方法
__getattr__(self, name) 如果name被访问,同时它不存在的时候,此方法被调用
__getattribute__(self, name) 当name被访问时自动被调用(这个进用于新类式),无论name是否存在,都要被调用
__delattr__(self, name) 如果要删除name,这个方法就被调用 """ class A(object):
def __getattr__(self, name): # 读属性,属性不存在时,调用此方法,即所谓的“拦截成员”
print "You use __getattr__" def __setattr__(self, name, value): #给对象赋值时,调用此方法
print "You use __setattr__"
self.__dict__[name] = value class B(object):
s = 'adg'
def __getattribute__(self, name):# 新式类,访问属性就掉哦有那个它
print "You are using __getattribute__"
return object.__getattribute__(self, name)
# 返回值没有调用return self.__dict__[name].因为如果调用这样的凡事就会访问self.__dict__,
# 只要访问这个属性,就要调用__getattribute__,这样就导致了无限递归下去成死循环 #例子
class Rectangle(object):
"""the width and length of Rectangle"""
def __init__(self):
self.width = 0
self.length = 0
def setSize(self, size):
self.width,self.length = size
def getSize(self):
return self.width,self.length
r = Rectangle()
r.width = 3
r.length = 4
print r.getSize()
r.setSize( (30, 40) )
print r.width
print r.length """改进,使用property函数"""
class Rectangle2(object):
"""the width and length of Rectangle"""
def __init__(self):
self.width = 0
self.length = 0
def setSize(self, size):
self.width,self.length = size
def getSize(self):
return self.width,self.length
size = property(getSize, setSize)
print "-------property()-------------"
s = Rectangle2()
s.width = 3
s.length = 4
print s.size
r.size = 30,40
print s.width
print s.length """@property,方法变成属性"""
class Rectangle3(object):
def __init__(self):
self.width = 0
self.length = 0
@property
def size(self):
return self.width, self.length
@size.setter
def size(self,size):
self.width,self.length = size print "------@property------------"
s = Rectangle3()
s.width = 3
s.length = 4
print s.size
s.size = 30,40
print s.width
print s.width """使用setattr和getattr"""
class Rectangle4(object):
def __init__(self):
self.width = 0
self.length = 0 def __setattr__(self, key, value):
if key == "size":
self.width, self.length = value
else:
self.__dict__[key] = value
def __getattr__(self, item):
if item == "size":
return self.width, self.length
else:
raise AttributeError
print "------------setattr,getattr---------"
s = Rectangle4()
s.width = 3
s.length = 4
print s.size
s.size = 30,40
print r.width
print r.length
结果:
(, ) -------property()-------------
(, ) ------@property------------
(, ) ------------setattr,getattr---------
(, )
__getattr__和__setattt__使用的更多相关文章
- python中__getattr__和__setattr__
代码: #!/usr/bin/env python #! -*- coding:utf-8 -*- class A(object): def __setattr__(self, key, value) ...
- __getattr__与__getattribute__
class Foo: def __init__(self,x): self.x=x def __getattr__(self, item): print("执行的是我----->&qu ...
- python 学习笔记7(类/对象的属性;特性,__getattr__)
27. 属性的__dict__系统 1)对象的属性可能来自: 其类的定义,叫做类属性 继承父类的定义 该对象实例定义(初始化对象时赋值),叫做对象属性 2)对象的属性存储在对象的 __dict__ 属 ...
- __getattr__ 与动态属性
直接上代码 >>> class Test(object): ... def __getattr__(self,attr_name): ... setattr(self, attr_n ...
- 一些代码 II (ConfigParser、创建大文件的技巧、__getattr__和__getattribute__、docstring和装饰器、抽象方法)
1. ConfigParser format.conf [DEFAULT] conn_str = %(dbn)s://%(user)s:%(pw)s@%(host)s:%(port)s/%(db)s ...
- python __setattr__, __getattr__, __delattr__, __call__
python __setattr__, __getattr__, __delattr__, __call__ getattr `getattr`函数属于内建函数,可以通过函数名称获取 value = ...
- __getattribute__()、__getattr__()、__setattr__()、__delattr__()
访问顺序: 实例的__getattribute__().Descriptor的__get__().实例的__dict__.只读Descriptor的__get__().实例的__getattr__() ...
- python面对对象编程-------5:获取属性的四种办法:@property, __setattr__(__getattr__) ,descriptor
一:最基本的属性操作 class Generic: pass g= Generic() >>> g.attribute= "value" #创建属性并赋值 > ...
- python __getattr__ 巧妙应用
在之前的文章有提到__getattr__函数的作用: 如果属性查找(attribute lookup)在实例以及对应的类中(通过__dict__)失败, 那么会调用到类的__getattr__函数, ...
随机推荐
- web服务器tomcat入门实战
一.tomcat介绍1.1 引入tomcat Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache.Su ...
- wordpress安装主题时提示无法创建目录
直接上解决办法: 找到wp-content文件夹(我的是在/home/wwwroot/default/wp-cotent) 首先给wp-content这个文件夹一个权限 chmod -R 775 wp ...
- app中页面滑动,防止a链接误触
问题 app中list列表,当我们用手滑动屏幕,屏幕上页面内容会快速滚动,不会因为手已经离开了屏幕而滚动停止,突然手触摸暂停,当手指是在a标签上面时,会跳转链接,这对客户体验及其不好 思路 先判断滚动 ...
- LeetCode(60): 第k个排列
Medium! 题目描述: 给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列. 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: "123" ...
- Java集合(Collection)综述
1.集合简介 数学定义:一般地,我们把研究对象统称为元素.把一些元素组成的总体叫做集合. java集合定义:集合就是一个放数据的容器,准确的说是放数据对象引用的容器. java中通用集合类存放于jav ...
- PHP 获取时间
1.获取系统当前时间 echo "date('Y-m-d',time())"; 2.获取系统前一天时间 echo "date("Y-m-d",strt ...
- PHP数组序列化和反序列化
PHP序列化在我们实际项目运行过程中是一种非常常见的操作.比如当我们想要将数组值存储到数据库时,就可以对数组进行序列化操作,然后将序列化后的值存储到数据库中.其实PHP序列化数组就是将复杂的数组数据类 ...
- html----常见的标签
HTML标签: <strike>为文字加上一条中线</strike> <em>: 文字变成斜体.</em> 2<sup>2</sup& ...
- python 全栈开发,Day112(内容回顾,单例模式,路由系统,stark组件)
一.内容回顾 类可否作为字典的key 初级 举例: class Foo(object): pass _registry = { Foo:123 } print(_registry) 执行输出: {&l ...
- HTTP协议特点
1 HTTP协议特点 1)客户端->服务端(请求request)有三部份 a)请求行--请求行用于描述客户端的请求方式.请求的资源名称,以及使用的HTTP协议版本号 请 ...