您好,欢迎访问一九零五行业门户网

七 个 Python 问题,来扫扫盲

这 7 个问题,我是有收获的,整理如下:
1、反射算术运算符你可能知道 python 里面的魔法函数,比如 __add__​ 和 __sub__​ 代表 + - 运算符,表示 obj +/- something,但你可能不知道还有一个 __radd__,__rsub__ 函数,可以表示 something +/- obj。
举例如下:
class dog: 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__ 在每次我们尝试访问属性时都会被调用。
代码如下:
class dog: def __init__(self, name, age): self.name = name self.age = age def __getattr__(self, key): return f{key} not found dog = dog(taidi, 5) print(dog.name)# taidi print(dog.age) # 5 print(dog.breed) # breed not found
class dog: def __init__(self, name, age): self.name = name self.age = age def __getattribute__(self, key): return f{key} not found dog = dog(taidi, 5) print(dog.name)# name not found print(dog.age) # age not found print(dog.breed) # breed not found
3、super().__init__() 的另一种写法class animal: def __init__(self, name, age): self.name = name self.age = age class dog(animal): def __init__(self, name, age, breed): super().__init__(name, age) self.breed = breed
等价于:
class animal: def __init__(self, name, age): self.name = name self.age = age class dog(animal): def __init__(self, name, age, breed): animal.__init__(self, name, age) self.breed = breed
请注意,animal.__init__(self, name, age) 不能少了 self 参数。
4、检查子类的方法class animal: pass class dog(animal): pass class cat(animal): pass class germansheperd(dog): pass print(animal.__subclasses__()) # [, ]
不过,.__subclasses__() 只能检查直接子类。
5、多重集成时,同名函数,子类用的是哪一个?class a: def test(self): print(a) class b: def test(self): print(b) class c(a, b): pass c().test() # a
a 和 b 都有 test 方法,那么 c 到底集成了哪一个呢?在 python 中,最左边的类优先。
在这里,a 是最左边的父类,因此 a 的 test 方法被集成。
多充继承让人困惑,不用为好。
6 __invert__ 魔法函数class dog: def __invert__(self): return test dog = dog() print(~dog) # test
~ 运算符代表“按位非”,通常用于反转内容。一个更有意义的例子如下:
class coordinate: def __init__(self, x, y): self.x = x self.y = y def __str__(self): return f({self.x}, {self.y}) def __invert__(self): return coordinate(-self.x, -self.y) a = coordinate(3, 4) b = ~a print(a, b) # (3, 4) (-3, -4)
7、不使用 class 来创建类def init(self, name, age): self.name = name self.age = age def bark(self): print(woof) dog = type(dog, (), {__init__:init, bark:bark}) dog = dog(taidi, 10) print(dog.name) print(dog.age) # taidi # 10
在这里,我们将 3 个参数传递给 type 以创建我们的类。
第一个参数 __name__​ 是类的名称 第二个参数 __bases__​ 是一个包含父类的元组 第三个参数 __dict__ 是一个包含属性和方法的字典。
等价于:
class dog: def __init__(self, name, age): self.name = name self.age = age def bark(self): print(woof)
以上就是七 个 python 问题,来扫扫盲的详细内容。
其它类似信息

推荐信息