Python进阶——面向对象之内置函数

本次要总结的的内置函数共8个,他们都跟面向对象的知识相关。

1. classmethod、staticmethod、property 。

上述三个内置函数在文章(Python进阶——面向对象之成员)的方法和属性中已经详细介绍使用,可以返回浏览,具体地址:https://blog.csdn.net/r1141207831/article/details/117909535

2. callable,是否可在后面加括号执行。

  • 函数
def func():
    pass

print( callable(func) ) # True
class Foo(object):
    pass

print( callable(Foo) ) # True
  • 类中具有__call__方法的对象
class Foo(object):
	pass

obj = Foo()
print( callable(obj) ) # False
class Foo(object):

    def __call__(self, *args, **kwargs):
        pass
    
obj = Foo()
print( callable(obj) ) # True

所以当你以后在见到下面的情况时,首先就要想到handler可以是:函数、类、具有call方法的对象 这三种,到底具体是什么,需要根据代码的调用关系才能分析出来。

def do_something(handler):
    handler()

3. super,按照mro继承关系向上找成员。

class Top(object):
    def message(self, num):
        print("Top.message", num)
        
class Base(Top):
    pass

class Foo(Base):

    def message(self, num):
        print("Foo.message", num)
        super().message(num + 100)


obj = Foo()
obj.message(1)

>>> Foo.message 1
>>> Top.message 101
class Base(object):

    def message(self, num):
        print("Base.message", num)
        super().message(1000)


class Bar(object):

    def message(self, num):
        print("Bar.message", num)


class Foo(Base, Bar):
    pass


obj = Foo()
obj.message(1)

>>> Base.message 1
>>> Bar.message 1000

应用场景

假设有一个类,他原来已实现了某些功能,但我们想在他的基础上再扩展点功能,重新写一遍?比较麻烦,此时可以用super。

info = dict() # {}
info['name'] = "华青水上"
info["age"] = 18

value = info.get("age")

print(value)
class MyDict(dict):

    def get(self, k):
        print("自定义功能")
        return super().get(k)


info = MyDict()
info['name'] = "华青水上" # __setitem__
info["age"] = 18       # __setitem__
print(info)

value = info.get("age")

print(value)

4. type,获取一个对象的类型。

v1 = "华青水上"
result = type(v1)
print(result) # <class 'str'>
v2 = "华青水上"
print( type(v2) == str )  # True

v3 = [11, 22, 33] # list(...)
print( type(v3) == list )  # True
class Foo(object):
    pass

v4 = Foo()

print( type(v4) == Foo )  # True

5. isinstance,判断对象是否是某个类或其子类的实例。

class Top(object):
    pass


class Base(Top):
    pass


class Foo(Base):
    pass


v1 = Foo()

print( isinstance(v1, Foo) )   # True,对象v1是Foo类的实例
print( isinstance(v1, Base) )  # True,对象v1的Base子类的实例。
print( isinstance(v1, Top) )   # True,对象v1的Top子类的实例。
class Animal(object):
    def run(self):
        pass

class Dog(Animal):
    pass

class Cat(Animal):
    pass

data_list = [
    "alex",
    Dog(),
    Cat(),
	"root"
]

for item in data_list:
    if type(item) == Cat:
        item.run()
    elif type(item) == Dog:
        item.run()
    else:
        pass
    
for item in data_list:
    if isinstance(item, Animal):
        item.run()
    else:
        pass

6. issubclass,判断类是否是某个类的子孙类。

class Top(object):
    pass


class Base(Top):
    pass


class Foo(Base):
    pass


print(issubclass(Foo, Base))  # True
print(issubclass(Foo, Top))   # True

至此,关于面向对象的一些内置函数已经总结完毕,如有不当之处,欢迎指正!

猜你喜欢

转载自blog.csdn.net/r1141207831/article/details/117911058