python Class:面向对象高级编程 __getattr__

发布时间:2020-07-23 23:40:52 作者:虎皮喵的喵
来源:网络 阅读:1832

官网解释:


当我们想调用Class中某些东西,而Class中没有,解释器铁定报错,停止运行,那有人就想了:真麻烦,每次都要重新执行一遍,如果当我调用错了内容,程序能把我这个错误当默认程序执行,而不停止我程序运行就好了。so,为了解决这类问题,就出来了__getattr__这个函数了。

我猜的,因为解决程序困难也是一种需求。 


看没有__getattr的出错调用:

#!/usr/bin/python

# -*- coding: utf-8 -*-


class Student(object):

    def __init__(self):

        self.name = 'Michael'


s = Student()

print s.name

print s.score      #Class中没有这个属性

python Class:面向对象高级编程 __getattr__

look, 第一个print正常执行,第二个由于Class中没有这个属性,所以就报错了。


再看,带__getattr__的Class:

#!/usr/bin/python

# -*- coding: utf-8 -*-


class Student(object):

    def __init__(self):

        self.name = 'Michael'


    def __getattr__(self, other):

        if other=='score':

            return 99

            

s = Student()

print s.name

python Class:面向对象高级编程 __getattr__

print s.score   #Class中没有这个属性

python Class:面向对象高级编程 __getattr__

print s.gg       #Class中没有这个属性

python Class:面向对象高级编程 __getattr__


look again, print 的score 和 gg 在Class中都没有定义,但都有输出。因为程序往__getattr__中找,刚刚好定义了一个字符判断 if other=='score':, 所以输出了99 ,而gg一个字都没提,就默认输出None了。是不是感觉以后码程序的时候再也不用担心程序停止运行了。



※发现的强大的链式调用写法:

class Chain(object):

    def __init__(self, path=''):
        self._path = path
    def __getattr__(self, path):
        return Chain('%s/%s' % (self._path, path))   #调用自己
    def __str__(self):
        return self._path

    __repr__ = __str__
    
f = Chain()
print (f.www.anc.do.glob)

结果:

/www/anc/do/glob


推荐阅读:
  1. Python中反射和描述器总结
  2. Python面向对象魔法方法和单例模块的示例分析

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python getattr 高级编程

上一篇:使用postMessage在不同iframe间跨域传递消息

下一篇: cocos2d-3x 版本tableview的使用(怎么取消弹簧效果);

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》