这7道题,收获了一些,整理如下:1.反射算术运算符你可能知道Python中的神奇函数,比如__add__和__sub__代表+-操作符表示obj+/-something,但你可能不知道还有一个__radd__,__rsub__函数可以表示something+/-obj。例如:classDog:def__add__(self,other):return"from__add__"def__radd__(self,other):return"from__radd__"dog=Dog()print(dog+1)#from__add__print(1+dog)#from__radd__2,__getattr__vs__getattribute____getattr__魔术方法只会在我们尝试获取不存在的属性时调用,每次我们尝试访问该属性时都会调用__getattribute__。代码如下:classDog:def__init__(self,name,age):self.name=nameself.age=agedef__getattr__(self,key):returnf"{key}notfound"dog=Dog("taidi",5)print(dog.name)#taidiprint(dog.age)#5print(dog.breed)#找不到品种Dog:def__init__(self,name,age):self.name=nameself.age=agedef__getattribute__(self,key):returnf"{key}notfound"dog=Dog("taidi",5)print(dog.name)#找不到名字print(dog.age)#找不到年龄print(dog.breed)#breednotfound3、super().__init__()的另一种写法classAnimal:def__init__(self,name,age):self.name=nameself.age=ageclassDog(Animal):def__init__(self,name,age,breed):super().__init__(name,age)self.breed=breed等价于:classAnimal:def__init__(self,name,age):self.name=nameself.age=ageclassDog(动物):def__init__(self,name,age,breed):动物。__init__(self,name,age)self.breed=breed请注意Animal.__init__(self,name,age)不能没有self参数4.检查子类classAnimal的方法:passclassDog(Animal):passclassCat(Animal):passclassGermanSheperd(Dog):passprint(Animal.__subclasses__())#[
