python中有一个方法,如__call __?

时间:2017-07-07 06:28:45

标签: python oop

如果x是其类中的对象方法" - call - "定义后,我们可以直接调用x()来执行方法" - call - "。有没有像" - call - "通过它我直接调用x来获取x属性的值?感谢

1 个答案:

答案 0 :(得分:0)

你好shuairenqin,

您可以使用python几个内置方法(如

)使用对象或实例访问class属性

1。对象。 getitem (自我,密钥)

被要求实施自我[密钥]的评估。对于序列类型,接受的键应该是整数和切片对象。请注意,负索引的特殊解释(如果类希望模拟序列类型)取决于 getitem ()方法。如果key是不合适的类型,则可能引发TypeError;如果序列的索引集之外的值(在对负值进行任何特殊解释之后),则应引发IndexError。对于映射类型,如果缺少键(不在容器中),则应引发KeyError。

Note for loops expect that an IndexError will be raised for illegal indexes to allow proper detection of the end of the sequence.

例如,

class Library:
    def __init__(self):
         self.books = { 'title' : 1, 'title2' : 2, 'title3' : 2 }
    def __getitem__(self, i):
             return self.books[i]
    def __iter__(self): 
        return self.books.itervalues()

librarya = Library()
print librarya['title']

2。 object。 call (self [,args ...])

当实例被“调用”为函数时调用;如果定义了这个方法,x(arg1,arg2,...)是x的简写。调用(arg1,arg2,...)。

例如,

class Animal(object):
    def __init__(self, name, legs):
        self.name = name
        self.legs = legs
        self.stomach = []        

    def __call__(self,food):
        self.stomach.append(food)

    def poop(self):
        if len(self.stomach) > 0:
            return self.stomach.pop(0)

    def __str__(self):        
        return 'A animal named %s' % (self.name)       

cow = Animal('king', 4)  #We make a cow
dog = Animal('flopp', 4) #We can make many animals
print 'We have 2 animales a cow name %s and dog named %s,both have %s legs' % (cow.name, dog.name, cow.legs)
print cow  #here __str__ metod work

#We give food to cow
cow('gras')
print cow.stomach

#We give food to dog
dog('bone')
dog('beef')
print dog.stomach

#What comes inn most come out
print cow.poop()
print cow.stomach  #Empty stomach

print cow
'''-->output
We have 2 animales a cow name king and dog named flopp,both have 4 legs
A animal named king
['gras']
['bone', 'beef']
gras
[]
'''

3。 object。 getattr (self,name)

当属性查找未在通常位置找到属性时调用(即,它不是实例属性,也不是在类树中找到自己)。 name是属性名称。此方法应返回(计算的)属性值或引发AttributeError异常。

请注意,如果通过常规机制找到属性,则不会调用 getattr ()。 (这是 getattr ()和 setattr ()之间的故意不对称。)这样做既出于效率原因,又因为 getattr ()无法访问实例的其他属性。请注意,至少对于实例变量,您可以通过不在实例属性字典中插入任何值来伪造总控制(而是将它们插入另一个对象中)。请参阅下面的 getattribute ()方法,了解在新式类中实际获得完全控制的方法。

例如,

class MyClass(object):

    def __init__(self):
        self.data = {'name1': 'Vora Mayur', 'name2': 'Vora Mihir'}

    def __getattr__(self, attr):
        return self.data[attr]

obj = MyClass()
print obj.name1