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类的子类。
作者:写bug写bug
链接:https://juejin.cn/post/7372913965884391439