Python 面向对象4-特殊成员

1.__call__

  类后面加()表示对象,执行__init__方法,对象后面加()执行__call__方法

class Foo:

    def __init__(self,name):
        self.name = name
        print ("init func")

    def __call__(self):
        print ("call func")

obj = Foo("Alex")
obj()

如果不定义__call__方法,那么执行obj()报错:

TypeError: 'Foo' object is not callable

如果定义了__call__方法,那么在对象后面加()则执行__call__方法。

2.__str__

  有一段代码如下:

class Foo:

    def __init__(self,name):
        self.name = name
        print ("init func")

    def __call__(self):
        print ("call func")
# class Bar(Foo):
#
#     def f3(self):
#         print (self.name)

obj = Foo("Alex")
print (obj)
结果:
  <__main__.Foo object at 0x013349B0>

我们想打印一个对象(obj)的内容,但是返回了一个类的内存地址,通过__str__方法可以实现这样的需求

class Foo:

    def __init__(self,name):
        self.name = name

    def __call__(self):
        print ("call func")

    def __str__(self):
        return self.name

obj = Foo("Alex")
print (obj)
结果:
  Alex

如果__init__方法中有多个字段,那么也可以利用字符串的拼接将结果返回回来

class Foo:

    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __call__(self):
        print ("call func")

    def __str__(self):
        return "%s - %s" %(self.name,self.age)

obj = Foo("Alex",18)
print (obj)
结果:
  Alex - 18

class Foo:

def __init__(self,name,age):
self.name = name
self.age = age

def __call__(self):
print ("call func")

# def __str__(self):
# return "%s - %s" %(self.name,self.age)

obj = Foo("Alex",18)
# print (obj)
ret = str(obj)
print (ret)
结果:
  <__main__.Foo object at 0x01D7F810>

如果没有__str__方法,那么str(返回)的类对象的内存地址,如果定义了__str__方法,在执行str(obj)的时候,自动调用__str__方法。

class Foo:

    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __call__(self):
        print ("call func")

    def __str__(self):
        return "%s - %s" %(self.name,self.age)

obj = Foo("Alex",18)
# print (obj)
ret = str(obj)
print (ret)
结果:
  Alex - 18

3.__add__ 

class Foo:

    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __call__(self):
        print ("call func")
def __add__(self, other):
        return "%s - %s" %(self.name,other.age)
obj1 = Foo("Alex",18)
obj2 = Foo("Lily",15)

ret = obj1 + obj2
print (ret)
结果:
  Alex - 15

__add__方法是对两个对象之间做加法,在做加法的时候系统自己调用该方法。

4.__dict__

  

__author__ = 'Alex'
#coding:utf-8

class Foo:

    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __call__(self):
        print ("call func")

    # def __str__(self):
    #     return "%s - %s" %(self.name,self.age)

    def __add__(self, other):
        return "%s - %s" %(self.name,other.age)
obj1 = Foo("Alex",18)
obj2 = Foo("Lily",15)

print (obj1.__dict__)
print (obj2.__dict__)
print (Foo.__dict__)
结果:
  

  {'age': 18, 'name': 'Alex'}
  {'age': 15, 'name': 'Lily'}
  {'__init__': <function Foo.__init__ at 0x013641E0>, '__doc__': None, '__module__': '__main__', '__call__': <function Foo.__call__ at 0x01364228>, '__add__': <function Foo.__add__ at 0x013640C0>, '__dict__': <attribute '__dict__' of 'Foo' objects>, '__weakref__': <attribute '__weakref__' of 'Foo' objects>}

5.__getitem__、__setitem__、__delitem__

class Foo:

    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __call__(self):
        print ("call func")

    # def __str__(self):
    #     return "%s - %s" %(self.name,self.age)

    def __add__(self, other):
        return "%s - %s" %(self.name,other.age)

    def __getitem__(self, item):
        return item

    def __setitem__(self, key, value):
        pass

    def __delitem__(self, key):
        pass

obj1 = Foo("Alex",18)

ret = obj1['aaa']
print (ret)

obj1['bbb'] = 456
ret1 = obj1['bbb']
print (ret1)

del obj1['bbb']
print (obj1['bbb'])

对象的切片访问形式,例如obj1[1:4]


class Foo:

def __init__(self,name,age):
self.name = name
self.age = age

def __call__(self):
print ("call func")

# def __str__(self):
# return "%s - %s" %(self.name,self.age)

def __add__(self, other):
return "%s - %s" %(self.name,other.age)

def __getitem__(self, item):
if type(item) is str:
print (item)
return item
else:
print (item.start)
print (item.stop)
print (item.step)


def __setitem__(self, key, value):
print (key.start)
print (key.stop)
print (key.step)
print (type(key),type(value))


def __delitem__(self, key):
print (type(key))
print (key.start)
print (key.stop)
print (key.step)

obj1 = Foo("Alex",18)
# ret = obj1['aaa']
# ret = obj1[1:4:2]
# obj1[1:4] = [11,22,33,44,55,66]
del obj1[1:4]
# print (ret)
# print (ret)
#
# obj1['bbb'] = 456
# ret1 = obj1['bbb']
# print (ret1)
#
# del obj1['bbb']
# print (obj1['bbb'])

6.__iter__

class Foo:

    def __iter__(self):
        return iter([11,22,33])


obj = Foo()
for item in obj:
    print (item)
结果:
  11
  22
  33

如果一个对象可以被迭代,那么就可以执行for循环。被循环的对象默认调用__iter__方法,返回值必须是一个可以被迭代的对象。

class Foo:

    def __iter__(self):              #生成器生成一个可迭代的对象
        yield 11
        yield 22


obj = Foo()
for item in obj:
    print (item)
结果:
  11
  22
原文地址:https://www.cnblogs.com/python-study/p/5737117.html