__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__函数, ...
随机推荐
- freeswitch用户整合(使用mysql数据库的用户表)
转:freeswitch用户整合(使用mysql数据库的用户表) freeswitch是一款强大的voip服务器,可以语音和视频.但是它默认是采用/directory文件夹下的xml来配置用户的,对于 ...
- Expm 4_2 有向无环图中的最短路径问题
[问题描述] 建立一个从源点S到终点E的有向无环图,设计一个动态规划算法求出从S到E的最短路径值,并输出相应的最短路径. 解: package org.xiu68.exp.exp4; import j ...
- PYTHON-匿名函数,递归与二分法,面向过程编程-练习
# 四 声明式编程练习题 # 1.将names=['egon','alex_sb','wupeiqi','yuanhao']中的名字全部变大写names = ['egon', 'alex_sb', ' ...
- VSCode配置python调试环境
VSCode配置python调试环境 很久之前的一个东东,翻出来看看 VSCode配置python调试环境 * 1.下载python解释器 * 2.在VSCode市场中安装Python插件 * 4.在 ...
- 性能测试二十四:环境部署之Redis多实例部署
由于redis服务端是单线程实现的,因此只能占用CPU的单核,为了充分利用CPU资源,可以在一台服务器上同时启动多个redis-server实例 首先删除之前的rdb.aof文件 注释掉3个save ...
- python 全栈开发,Day17(初识面向对象)
一.引子 第一次参加工作,进入了一家游戏公司,公司需要开发一款游戏<人狗大战>一款游戏,首先得把角色和属性定下来. 角色有2个,分别是人和狗属性如下:人 :昵称.性别.血.攻击力狗 :名字 ...
- CCF CSP 201703-3 Markdown
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201703-3 Markdown 问题描述 Markdown 是一种很流行的轻量级标记语言(l ...
- canvas简单下雨特效
前面做了两个简单的效果,这次就来个下雨的效果 思路简单的说一下 随机在屏幕中的位置画雨滴,moveTo(x,y) 雨滴的长度就是lineTo(x,y+len) 每次重新绘制页面,就能达到下雨的效果了 ...
- zjoi2017 仙人掌
题解: 好难的dp啊...看题解看了好久才看懂 http://blog.csdn.net/akak__ii/article/details/65935711 如果一开始的图就不是仙人掌,答案显然为0, ...
- django 10.5 sqlite3迁移到mysql
参考: http://www.voidcn.com/article/p-hesvaooz-ru.html 原文: python ./manage.py syncdb --database slave ...