Python 看书的一些记录 运算符重载

1.类和模块有什么关系?

  (1)类是模块的一部分,是模块对象的属性。

  (2)类和模块都是命名空间,但是类是对于语法的。模块是对于文件的

  (3)类支持多个实例,但是模块被导入时只有一个。

2.什么是抽象超类(抽象基类)?

  抽象超类就是指类的部分行为需要由其子类提供

class Person(object):
    """docstring for Person"""
    def __init__(self,name):
        self.name = name
    def test_func(self):
        self.action() # 实现action方法需要在子类中定义进行调用


class Teacher(Person):
    """docstring for Teacher"""
    def action(self):
        print(self.name)
        
if __name__ =="__main__":
    teacher = Teacher("sunqi")
    teacher.test_func()

 3.Python中的迭代环境都会先尝试调用__iter__方法,如果没有才会调用__getitem__方法进行索引取值。

  • 每次进行迭代,都会尝试用对象的iter内置函数去调用__iter__方法,返回一个迭代器对象,然后不断调用返回对象的next方法,

    直到发生StopIteration异常

  • 若没有__iter__方法,就会调用__getitem__方法,不断索引取值,直到发生IndexError异常。

4.类中的__getattr__与__setattr__

__getattr__ 会在类中查找属性时调用。

__setattr__ 会在设置属性时调用

__getattribute__会在查找属性时调用(无论属性是否存在)

class Test(object):
    def __init__(self,data):
        self.data = data
    def __getattribute__(self,attrname):
        print("__getattribute__")
        return object.__getattribute__(self,attrname)
    def __getattr__(self,attrname):
        print("__getattr__")
        if attrname == "age":
            return 40 
        else :
            return AttributeError
    def __setattr__(self,attrname,value):
        print("__setattr__")
        self.__dict__[attrname] = value
        # self.__setattr__(attrname,value)

if __name__ == "__main__":
    t = Test("test")
    print(t.data)
    print("*" * 10)
    print(t.age)
    print("*" * 10)
    print(t.name)
    t.name = "sunqi"


__setattr__
__getattribute__
__getattribute__
test
**********
__getattribute__
__getattr__
40
**********
__getattribute__
__getattr__
<class 'AttributeError'>
__setattr__
__getattribute__

 5.右侧加法和原处加法__radd__ , __iadd__

当加号右侧是类实例,左侧不是类实例才会调用__radd__,其他情况都会由左侧对象调用__add__方法(了解一下)

__iadd__ 实现了+=功能

猜你喜欢

转载自www.cnblogs.com/SunQi-Tony/p/9903170.html