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