Python天天美味(26) - __getattr__与__setattr__

Posted on 2008-05-25 15:39 CoderZh 阅读(251) 评论(14)  编辑 收藏 所属分类: Python

__getattr__和__setattr__可以用来对属性的设置和取值进行处理,比如下面的例子:

class Book(object):
    def __setattr__(self, name, value):
        if name == 'value':
            object.__setattr__(self, name, value - 100)
        else:
            object.__setattr__(self, name, value)
    def __getattr__(self, name):
        try:
            return object.__getattribute__(name)
        except:
            return name + ' is not found!'
    def __str__(self):
        return self.name + ' cost : ' + str(self.value)

c = Book()
c.name = 'Python'
c.value = 100
print c.name
print c.value
print c
print c.Type


上面的例子中,在赋值书的value属性时,偷偷的将value减去了100,呵。输出结果:

Python
0
Python cost : 0
Type is not found!
Tag标签: PythonCookBook

Feedback

#1楼    回复  引用    

2008-06-01 11:17 by 七两半 [未注册用户]
向博主求助
事情是这样的,我需要在shell下写个小程序
我使用raw_input获取用户输入密码时,密码显示为明文了
如果让它在输入时显示为'*'号???
在网上搜了,没搜到结果
望回复,thanks

#2楼 [楼主]   回复  引用  查看    

2008-06-01 13:46 by CoderZh      
@七两半
谢谢你的关注,你的问题可以用下面的方法解决:
import getpass

passwd 
= getpass.getpass('enter your password')

raw_input(
'Press ENTER to show the password..')

print passwd

#3楼    回复  引用    

2008-06-01 15:15 by 七两半 [未注册用户]
多谢博主
我是新手,很多模块都还不知道,英文手册又看不懂,麻烦啊

#4楼 [楼主]   回复  引用  查看    

2008-06-01 15:20 by CoderZh      
@七两半
不客气

#5楼    回复  引用    

2008-06-01 21:16 by T [未注册用户]
请问为何name == 'value'呢?谢谢!

#6楼 [楼主]   回复  引用  查看    

2008-06-02 08:40 by CoderZh      
@T
name = 'value' 是指,如果属性名称是'value'的话

#7楼    回复  引用    

2008-06-02 18:58 by 未注册用户 [未注册用户]
哦,我明白了,是我对__setattr__理解有错误,感谢LZ热心回复!

#8楼 [楼主]   回复  引用  查看    

2008-06-02 19:03 by CoderZh      
@未注册用户
呵呵~不客气

#9楼    回复  引用    

2008-06-04 15:04 by tony124cft [未注册用户]
麻烦问一下,上面有个代码没懂。请帮忙解释一下呀。
import getpass
passwd = getpass.getpass('enter your password')
raw_input('press enter to show the password..')
print passwd
这段代码是不是可以用****的方式输入密码?但是我在机器上试过,我输入什么,他就显示什么,并没有显示为***
请问是怎么回事呀。

#10楼 [楼主]   回复  引用  查看    

2008-06-04 15:23 by CoderZh      
@tony124cft
你不要在IDE里运行,直接用Python xxx.py命令运行,或是双击运行,就不会显示输入的内容了。但要把输入的内容变成 * ,应该不行。
你看Linux的终端里输入密码,也是看不到输入的任何东东的。呵呵
要看到星号的话,除非自己特殊处理每个键入的字符,或者如果是GUI 开发的话,如使用wxPython,或许有这样的功能。

#11楼    回复  引用  查看    

2008-06-12 16:02 by 阿纳金      
@CoderZh
我看了其他文档关于getattr这个函数的介绍:
getattr(object, "attribute") 等价于 object.attribute
我这样写的:
li = ['eee','vvv','ddd','ooo']
li.pop()
删除了最后的'ooo'
如果换成上面的
getattr(li,"pop")
同样能删掉最后以个'ddd'但是结果没有变化
我那里理解错了吗?

#12楼 [楼主]   回复  引用  查看    

2008-06-12 20:02 by CoderZh      
@阿纳金
p = getattr(li,"pop")
p()

#13楼    回复  引用  查看    

2008-06-13 09:00 by 阿纳金      
恩,刚才又敲了一遍,解决了,谢谢呀。

#14楼 [楼主]   回复  引用  查看    

2008-06-13 09:29 by CoderZh      
@阿纳金
呵呵,不客气

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-09-06 14:10 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接: