5个鲜为人知的内置Python函数
callable(x)
callable(x)
函数检查x是否可被调用。
def hello():
pass
hi = 1
print(callable(hello)) # True
print(callable(hi)) # False
如果我们有一组变量,不确定它们是否可调用,可以先用callable
函数检查,然后再尝试像调用函数一样去调用它们。
class Dog:
def __call__(self, x):
pass
class Cat:
pass
dog = Dog()
cat = Cat()
print(callable(dog)) # True
print(callable(cat)) # False
callable
不仅适用于函数,也能用于对象上,我们可以在类上定义__call__
方法让产生的对象变得可调用。
divmod(x, y)
print(divmod(6, 3)) # (2, 0)
print(divmod(7, 3)) # (2, 1)
print(divmod(8, 3)) # (2, 2)
print(divmod(9, 3)) # (3, 0)
调用divmod(x, y)
时,它会返回一个包含两个元素的元组:
-
x除以y的商,相当于
x // y
-
x除以y的余数,相当于
x % y
使用divmod(x, y)
可以简化代码,将两个数值运算符x // y
和x % y
合并为一行。
hasattr(object, attribute_name)
asattr(object, attribute_name)
用于检查对象是否具有名为attribute_name
的属性。如果对象确实有这个属性,函数返回True,否则返回False。
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
class Cat:
def __init__(self, name, age, colour):
self.name = name
self.age = age
self.colour = colour
dog = Dog('rocky', 5)
cat = Cat('catty', 6, 'brown')
print(hasattr(dog, 'colour')) # False
print(hasattr(cat, 'colour')) # True
我们定义了Dog类具有name
和age
属性,而Cat类则具有name
、age
和colour
属性。
-
hasattr(dog, 'colour')
返回False,因为Dog类没有定义colour
属性。 -
hasattr(cat, 'colour')
返回True,因为Cat类定义了colour
属性。
使用hasattr
函数可以在尝试访问属性前,先检查对象是否包含该属性。
isinstance(object, class)
isinstance(object, class)
函数检查对象是否是指定类的实例,或者是否继承自该类,返回True或False。
class Animal: pass
class Dog(Animal): pass
class Rice: pass
让我们定义一些类:
-
一个Animal类
-
一个从Animal继承的Dog类
-
一个Rice类
dog = Dog()
print(isinstance(dog, Dog)) # True
print(isinstance(dog, Animal)) # True
print(isinstance(dog, Rice)) # False
-
isinstance(dog, Dog)
返回True,因为dog是Dog类的实例。 -
isinstance(dog, Animal)
返回True,因为Dog类继承自Animal类,所以dog也是Animal的实例。 -
isinstance(dog, Rice)
返回False,因为dog不是Rice类的实例。
a = Animal()
print(isinstance(a, Dog)) # False
print(isinstance(a, Animal)) # True
print(isinstance(a, Rice)) # False
-
Dog 继承 Animal → 所以Dog 是 Animal,但 Animal 不一定是 Dog 所以
isinstance(a, Dog)
返回 False -
a
是Animal
类的实例,因此isinstance(a, Animal)
返回 True -
a
不是Rice
类的实例,因此isinstance(a, rice)
返回 False
issubclass(class1, class2)
issubclass(class1, class2)
函数检查class1是否是class2的子类或两者相同,返回True或False。
class Animal: pass
class Dog(Animal): pass
class GermanShepherd(Dog): pass
print(issubclass(Animal, Animal)) # True
print(issubclass(Dog, Animal)) # True
print(issubclass(GermanShepherd, Animal)) # True
-
issubclass(Animal, Animal)
返回True,因为Animal类是它自己的子类。 -
issubclass(Dog, Animal)
返回True,因为Dog类继承自Animal类。 -
issubclass(GermanShepherd, Animal)
返回True,因为GermanShepherd类继承自Dog类,而Dog类又继承自Animal类。
print(issubclass(Animal, Dog)) # False
issubclass(Animal, Dog)
返回False,因为虽然Dog类是Animal类的子类,但Animal类不一定是Dog类的子类。
转载自:https://juejin.cn/post/7372913965884391439