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