码迷,mamicode.com
首页 > 编程语言 > 详细

python:订制类

时间:2017-11-24 17:05:07      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:attr   recent   ==   def   除了   情况   color   obj   attribute   

__str__

__repr__

__iter__

__next__

__getitem__

__getattr__


正常情况下,当我们调用类的方法或属性时,如果不存在,就会报错。比如定义Student类:

class Student(object):

    def __init__(self):
        self.name = Michael

调用name属性,没问题,但是,调用不存在的score属性,就有问题了:

>>> s = Student()
>>> print(s.name)
Michael
>>> print(s.score)
Traceback (most recent call last):
  ...
AttributeError: Student object has no attribute score

错误信息很清楚地告诉我们,没有找到score这个attribute。

要避免这个错误,除了可以加上一个score属性外,Python还有另一个机制,那就是写一个__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

返回函数也是完全可以的:

 

 

class Student(object):

    def __getattr__(self, attr):
        if attr==age:
            return lambda: 25

只是调用方式要变为:

>>> s.age()
25

注意,只有在没有找到属性的情况下,才调用__getattr__,已有的属性,比如name,不会在__getattr__中查找。

 

python:订制类

标签:attr   recent   ==   def   除了   情况   color   obj   attribute   

原文地址:http://www.cnblogs.com/mirrorlake/p/7890954.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!