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__ 实现了+=功能