# 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__使用的更多相关文章

  1. python中__getattr__和__setattr__

    代码: #!/usr/bin/env python #! -*- coding:utf-8 -*- class A(object): def __setattr__(self, key, value) ...

  2. __getattr__与__getattribute__

    class Foo: def __init__(self,x): self.x=x def __getattr__(self, item): print("执行的是我----->&qu ...

  3. python 学习笔记7(类/对象的属性;特性,__getattr__)

    27. 属性的__dict__系统 1)对象的属性可能来自: 其类的定义,叫做类属性 继承父类的定义 该对象实例定义(初始化对象时赋值),叫做对象属性 2)对象的属性存储在对象的 __dict__ 属 ...

  4. __getattr__ 与动态属性

    直接上代码 >>> class Test(object): ... def __getattr__(self,attr_name): ... setattr(self, attr_n ...

  5. 一些代码 II (ConfigParser、创建大文件的技巧、__getattr__和__getattribute__、docstring和装饰器、抽象方法)

    1. ConfigParser format.conf [DEFAULT] conn_str = %(dbn)s://%(user)s:%(pw)s@%(host)s:%(port)s/%(db)s ...

  6. python __setattr__, __getattr__, __delattr__, __call__

    python __setattr__, __getattr__, __delattr__, __call__ getattr `getattr`函数属于内建函数,可以通过函数名称获取 value = ...

  7. __getattribute__()、__getattr__()、__setattr__()、__delattr__()

    访问顺序: 实例的__getattribute__().Descriptor的__get__().实例的__dict__.只读Descriptor的__get__().实例的__getattr__() ...

  8. python面对对象编程-------5:获取属性的四种办法:@property, __setattr__(__getattr__) ,descriptor

    一:最基本的属性操作 class Generic: pass g= Generic() >>> g.attribute= "value" #创建属性并赋值 > ...

  9. python __getattr__ 巧妙应用

    在之前的文章有提到__getattr__函数的作用: 如果属性查找(attribute lookup)在实例以及对应的类中(通过__dict__)失败, 那么会调用到类的__getattr__函数, ...

随机推荐

  1. makefile 字符串处理函数

    截取自<跟我一起写Makefile> (1)  $(subst <from>, <to>, <text>) 名称: 字符串替换函数 subst 功能: ...

  2. 转载:Java中的字符串常量池详细介绍

    引用自:http://blog.csdn.net/langhong8/article/details/50938041 这篇文章主要介绍了Java中的字符串常量池详细介绍,JVM为了减少字符串对象的重 ...

  3. 了解的CAP和BASE等理论

    CAP,BASE和最终一致性是NoSQL数据库存在的三大基石.而五分钟法则是内存数据存储的理论依据.这个是一切的源头. 几个名词解释: 网络分区:俗称“脑裂”.当网络发生异常情况,导致分布式系统中部分 ...

  4. Highcharts 使用

    官网:https://www.hcharts.cn/ api:https://api.hcharts.cn/highcharts 效果 html代码 <div id="containe ...

  5. STM32F412应用开发笔记之七:片上ADC的应用测试

    在我们的应用项目中需要采集一些模拟量,这些量使用MCU自带的ADC就可以满足要求.在NUCLEO-F412ZG实验板上的STM32F412ZG有一个16通道的ADC,我们试验用它采集几个数据. 在NU ...

  6. 无法下载apk等格式的文件的解决方案---ASP .NET Core 2.0 MVC 发布到IIS上以后无法下载apk等格式的文件的解决方案

    ASP .NET Core MVC 发布到  IIS 上以后 无法下载apk等格式的文件 使用.NET Core MVC创建了一个站点,其他文件可以下载,但是后来又需求,就把手机端的apk合适的文件上 ...

  7. 【splunk】启动停止

    在控制台 splunk目录/bin下 ./splunk start #启动 ./splunk stop #停止 启动时出错,需要更改一下SPLUNK的配置 $SPLUNK_HOME/etc/splun ...

  8. 跨域资源共享CORS

    CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing).它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而 ...

  9. BZOJP1899ZJOI2004

    老早的一道水题 题意: 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以 ...

  10. 【AtCoder】ARC080

    C - 4-adjacent 我们挑出来4的倍数和不是4的倍数而是2的倍数,和奇数 然后就是放一个奇数,放一个4,如果一个奇数之后无法放4,然后它又不是最后一个,那么就不合法 #include < ...