当前位置: 首页 > 科技观察

Python七题,扫盲

时间:2023-03-17 11:43:22 科技观察

这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__())#[,]但是,.__subclasses__()只能检查直接子类。5、在多重集成的情况下,哪个同名函数,子类使用哪个?classA:deftest(self):print("A")classB:deftest(self):print("B")classC(A,B):passC().test()#AA和B有测试方法,那么C集成哪一个呢?在Python中,最左边的类优先。这里,A是最左边的父类,所以整合了A的test方法。过度收费仍然令人困惑,所以最好不要这样做。6__invert__magicfunctionclassDog:def__invert__(self):return"test"dog=Dog()print(~dog)#test~运算符代表“按位非”,通常用于反转内容。一个更有意义的例子如下:y})"def__invert__(self):returnCoordinate(-self.x,-self.y)a=Coordinate(3,4)b=~aprint(a,b)#(3,4)(-3,-4)7。不要使用类来创建类definit(self,name,age):self.name=nameself.age=agedefbark(self):print("woof")Dog=type("Dog",(),{"__init__":init,"bark":bark})dog=Dog("taidi",10)print(dog.name)print(dog.age)#taidi#10在这里,我们将3的参数传递给类型来创建我们的类。第一个参数__name__是类名第二个参数__bases__是包含父类的元组第三个参数__dict__是包含属性和方法的字典。等价于:classDog:def__init__(self,name,age):self.name=nameself.age=agedefbark(self):print("woof")