面向对象深度探索day1

类型判断

issubclass

首先,我们先看issubclass() 这个内置函数可以帮我们判断x类是否是y类型的子类

class Base:
    pass


class Foo(Base):
    pass


class Bar(Foo):
    pass

print(issubclass(Bar, Foo))  # True
print(issubclass(Foo, Bar))  # False
print(issubclass(Bar, Base))  # True

 

type

type(obj) 表示查看obj是由哪个类创建的

class Foo:
    pass

obj = Foo()
print(obj, type(obj))  # 查看obj的类

 

isinstance

isinstance可以判断x是否是y类的对象,isinstance可以判断该对象是否是家族体系中的(只能往上判断类)

class Base:
    pass

class Foo(Base):
    pass

class Bar(Foo):
    pass

print(isinstance(Foo(), Foo))  # True
print(isinstance(Foo(), Base))  # True
print(isinstance(Foo(), Bar))   # False

 

 

反射

反射的四个函数

  1. hasattr(obj, str) 判断obj中是否包含str成员
  2. getattr(obj,str) 从obj中获取str成员。
  3. setattr(obj, str, value) 把obj中的str成员设置成value。这⾥的value可以是值,也可以是函数或者⽅法。
  4. delattr(obj, str) 把obj中的str成员删除掉。

importlib

importlib是一个可以根据字符串的模块名实现动态导入模块的库。

举个例子:

目录结构:

├── aaa.py
├── bbb.py
└── mypackage
    ├── __init__.py
    └── xxx.py

使用importlib动态导入模块:

bbb.py

import importlib

func = importlib.import_module('aaa')
print(func)
func.f1()

m = importlib.import_module('mypackage.xxx')
print(m.age)

 

类的其他成员

__str__

改变对象的字符串显示。可以理解为使用print函数打印一个对象时,会自动调用对象的__str__方法

class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        
    # 定义对象的字符串表示
    def __str__(self):
        return self.name
    
s1 = Student('张三', 24)
print(s1)  # 会调用s1的__str__方法

__repr__

在python解释器环境下,会默认显示对象的repr表示。

>>> class Student:
...     def __init__(self, name, age):
...         self.name = name
...         self.age = age
...     def __repr__(self):
...         return self.name
... 
>>> s1 = Student('张三', 24)
>>> s1
张三

总而言之:

str函数或者print函数调用的是obj.__str__()
repr函数或者交互式解释器调用的是obj.__repr__()

注意:
如果__str__没有被定义,那么就会使用__repr__来代替输出。
__str__和__repr__方法的返回值都必须是字符串。

 

__format__

class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    __format_dict = {
        'n-a': '名字是:{obj.name}-年龄是:{obj.age}',  # 名字是:lqz-年龄是:18
        'n:a': '名字是:{obj.name}:年龄是:{obj.age}',  # 名字是:lqz:年龄是:18
        'n/a': '名字是:{obj.name}/年龄是:{obj.age}',  # 名字是:/年龄是:18
    }

    def __format__(self, format_spec):
        if not format_spec or format_spec not in self.__format_dict:
            format_spec = 'n-a'
        fmt = self.__format_dict[format_spec]
        print(fmt) #{obj.name}:{obj.age}
        return fmt.format(obj=self)

s1 = Student('lqz', 24)
ret = format(s1, 'n/a')
print(ret)  # lqz/24

 

上一篇:第6课.网络编程


下一篇:从零开始创建微服务-全栈-day1