pytho的问题(pytho问题及解决方法)
导语:七个Python问题,来扫扫盲
你可能知道 Python 里面的魔法函数,比如 __add__ 和 __sub__ 代表 + - 运算符,表示 obj +/- something,但你可能不知道还有一个 __radd__,__rsub__ 函数,可以表示 something +/- obj。
这 7 个问题,我是有收获的,整理如下:
1、反射算术运算符
你可能知道 Python 里面的魔法函数,比如 __add__? 和 __sub__? 代表 + - 运算符,表示 obj +/- something,但你可能不知道还有一个 __radd__,__rsub__ 函数,可以表示 something +/- obj。
举例如下:
class Dog:
def __add__(self, other):
return
def __radd__(self, other):
return
dog = Dog()
print(dog + 1) 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
dog = Dog(, 5)
print(dog.name) 5
print(dog.breed) 34;{key} not foundtaidi& name not found
print(dog.age) 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__())
39;__main__.Dog&39;__main__.CatAB& A
A 和 B 都有 test 方法,那么 C 到底集成了哪一个呢?在 Python 中,最左边的类优先。
在这里,A 是最左边的父类,因此 A 的 test 方法被集成。
多充继承让人困惑,不用为好。
6 __invert__ 魔法函数
class Dog:
def __invert__(self):
return
dog = Dog()
print(~dog) 34;({self.x}, {self.y})& (3, 4) (-3, -4)
7、不使用 class 来创建类
def init(self, name, age):
self.name = name
self.age = age
def bark(self):
print()
Dog = type(, (), {:init, :bark})
dog = Dog(, 10)
print(dog.name)
print(dog.age)
10
在这里,我们将 3 个参数传递给 type 以创建我们的类。
第一个参数 __name__? 是类的名称 第二个参数 __bases__? 是一个包含父类的元组 第三个参数 __dict__ 是一个包含属性和方法的字典。
等价于:
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
def bark(self):
print()
免责声明:本站部份内容由优秀作者和原创用户编辑投稿,本站仅提供存储服务,不拥有所有权,不承担法律责任。若涉嫌侵权/违法的,请反馈,一经查实立刻删除内容。本文内容由快快网络小若创作整理编辑!