# 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. Window下通过charles代理抓取iphone/android手机Https请求乱码问题处理

    Window下通过charles代理抓取iphone手机Https请求乱码问题 如果保持默认设置,https的reqeust和response都是乱码,设置完之后https就可以抓包了 手机端操作: ...

  2. android margin--负的margin的使用

    通常情况下,如果我们想要两个控件实现重叠的效果,一般都是使用FrameLayout 或者RelativeLayout布局.其实,如果设置两个控件的margin值为负数,也能实显控件重叠的效果. 先展示 ...

  3. Android天气预报

    Android天气预报 1.指定 WebService 的命名空间和调用方法import org.ksoap2.serialization.SoapObject;private static fina ...

  4. Linux在bash history当中添加timestamp

    执行以下两条命令即可 echo 'export HISTTIMEFORMAT="%y-%m-%d %T "' >> /etc/profile source /etc/p ...

  5. 【svn】svn的使用

    直接看这个教程:http://www.runoob.com/svn/svn-tutorial.html 里面讲得很有条理,很容易看懂.提供了指令以及相应的名词解释.不像其他网上的资料,干巴巴的只有一对 ...

  6. linux 搜索文件

    https://blog.csdn.net/json_ligege/article/details/72865645 1.find   find是最常见和最强大的查找命令,你可以用它找到任何你想找的文 ...

  7. PHP递归排序

    递归算法对于任何一个编程人员来说,应该都不陌生.因为递归这个概念,无论是在PHP语言还是Java等其他编程语言中,都是大多数算法的灵魂. 对于PHP新手来说,递归算法的实现原理可能不容易理解.但是只要 ...

  8. php三种无限分类

    无限分类,是指从一个最高分类开始,每个子分类都可以分出自己的若干个子分类,可以一直分下去,称为无限级分类: 下面是对省市县的无限极分类的列子.数据库如图: 代码示例如下: /** * @Descrip ...

  9. 算法-----python实现

    斐波那契数列 def f(n): if n == 1: return 1 elif n == 2: return 1 else: return f(n-1)+f(n-2) print(f(8)) 用普 ...

  10. Linux权限命令

    Linux 基础——权限管理命令chmod   一.Linux中的文件权限与目录权限 Linux中定义了3种访问权限,分别是r.w.x.其中r表示对象是可读的,w表示对象是可写的,x表示对象是可执行的 ...