定制类

本文介绍了Python中类的__init__,__str__,__getattr__及__setattr__方法的用途与实现细节。__init__用于初始化属性;__str__使类实例可被打印;__getattr__在尝试获取未定义属性时返回默认值;而__setattr__则拦截所有属性赋值。

__init__ 初始化 一般是用来定义属性的一个方法

__str__ 可以让类打印出来

class Person(object):
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender
    def __str__(self):

        return '(Person: %s, %s)' % (self.name, self.gender)

>>> p = Person('XIAOMING', 'male')
>>> print p

(Person: XIAOMING, male)

__getattr__调用了没有定义的属性时,返回特定的东西。

class Student(object):

    def __init__(self):
        self.name = 'Michael'

    def __getattr__(self, attr):
        if attr=='score':
            return 99

当调用不存在的属性时,比如score,Python解释器会试图调用__getattr__(self, 'score')来尝试获得属性,这样,我们就有机会返回score的值:

>>> s = Student()
>>> s.name
'Michael'
>>> s.score
99

__setattr__

会拦截所有属性的的赋值语句。如果定义了这个方法,self.attr= value 就会变成self,__setattr__("attr", value).这个需要注意。当在__setattr__方法内对属性进行赋值是,不可使用self.attr = value,因为他会再次调用self,__setattr__("attr", value),则会形成无穷递归循环,最后导致堆栈溢出异常。应该通过对属性字典做索引运算来赋值任何实例属性,也就是使用self.__dict__['name'] = value.


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值