我是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
答案 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
将其大写并返回它而不是在你的脸上抛出错误。