无法理解代码 - 新手

时间:2018-01-12 06:22:30

标签: python

我是python的新手(1周前开始),这是我第一次进行编码,所以我也无法理解相当简单的事情。

你可以向我解释这个功能吗?我知道正在定义一个函数,需要2个输入self和my_object,但接下来会发生什么?请像新手一样解释。

class chain():
    def __init__(self, my_object):
        self.o = my_object

    def __getattr__(self, attr):
        x = getattr(self.o, attr)
        if hasattr(x, '__call__'):
            method = x
            return lambda *args: self if method(*args) is None else method(*args)
        else:
            prop = x
            return prop

2 个答案:

答案 0 :(得分:0)

chain在其构造函数中采用名为my_object的变量,并将其分配给实例属性self.o

__getattr__方法是一种特殊的魔术方法,并且正在重写以将调用委托给我们首次收到的my_object变量。

然后测试该委托调用的返回值是否有方法__call__。如果是,则调用该方法并返回该值。如果它没有,它就会返回那个东西。

答案 1 :(得分:0)

首先,chain不是一个函数,它是一个类。

简单的单词是对象的定义。 (说汽车)

现在,类的__init__函数只是定义了“in it”中的含义,意味着它具有哪些变量或属性。比如说一个班级Car

class Car:
    def __init__(self,maxspeed,color):
        self.speed = maxspeed #So what's defined under **__init__** is a property of a class.
        self.color = color

所以这里Class Car将速度和颜色作为变量(或属性或属性)

现在有一些方法,只是简单的函数来控制对象的行为及其功能。

class Car:
    def __init__(self,maxspeed,color):
        self.speed = maxspeed #So what's defined under **__init__** is a property of a class.
        self.color = color
    def accelarate(self):   #Method to increase the speed of car object.
        self.sepped = self.speed + 10 

现在你拥有的方法是一个神奇的方法,__getattr__

说出你想要获得汽车品牌的场景,现在你还没有在它的self.brand函数中定义__init__,所以当你调用它时你会得到一个错误:

>>>red_car = Car(100,red) #Creating an object named red_car of class Car
>>>red_car.color
>>>'red'
>>>red_car.brand
>>> Attribute Error , Class car dosen't has attribute brand

现在在调用对象的未定义属性时删除此错误或者说简单我们告诉类如果调用未定义的变量该怎么做我们使用方法__getattr__

class Dummy(object):
    def __getattr__(self, attr):
        return attr.upper()

d = Dummy()
d.does_not_exist # 'DOES_NOT_EXIST'
d.what_about_this_one  # 'WHAT_ABOUT_THIS_ONE'

在上面的代码does_not_exist中,属性(属性)没有定义,但我们仍然没有得到错误,因为getattr捕获它并按照指示执行。在这种情况下,它捕获attr将其大写并返回它而不是在你的脸上抛出错误。