• Python 基础之面向对象之类中的方法和与类相关的魔术属性以及反射


    一.类中的方法

    普通方法: 没有参数,只能类调用
    绑定方法: (1)绑定到对象(自动传递对象参数) (2)绑定到类(自动传递参数)
    静态方法: 无论是类还是对象,都能调用的方法

    #:
    class Dog():
        def __init__(self,name):
            self.name = name

        #普通方法
        def jiao():
            print("小狗会叫")

        #绑定到对象方法
        def tian(self):
            print("小狗喜欢舔骨头")

        #绑定到类方法
        @classmethod
        def chi(cls):
            print(cls)
            print("小狗喜欢吃肉")

        #静态方法
        @staticmethod
        def jump():
            print("小狗喜欢跳起来接飞盘")

    #实例化对象
    obj = Dog("小黑")

    # (1)普通方法

    Dog.jiao()
    #对象无法调用,只能用类.方法

    # (2)绑定到对象方法

    obj.tian()

    #Dog.tian(123)  #如果硬要使用类来调用,满足实参一一对应(随机加个值)

    # (3)绑定到对象方法

    Dog.chi()
    # 用对象调用绑定到类的方法是可以的
    # 先找出该对象所归属的类是谁,然后再传递这个类
    obj.chi()

    # (4)静态方法

    obj.jump()
    Dog.jump()

    二.与类相关的魔术属性

    #:

    class Human():
        pass

    class Man():
        pass

    class Woman():
        pass


    class Children(Man, Woman):
        '''
        类的功能: 描述一个小孩
        类的成员属性: eye
        类的成员方法: sleep __beat_doudou
        '''
        eye = "蓝色的眼睛"
        #普通方法
        def eat():
            print("小孩需要多吃有营养的东西")

        #绑定方法
        def sleep(self):
            print("小孩喜欢睡觉")

        def drink(self):
            print("小孩要经常喝水")

        def cry(self, func):
            res = func.__name__
            print(res, type(res))

        #私有绑定方法
        def __beat_doudou(self):
            print("小孩喜欢打豆豆")

    #__dict__ 获取对象或类的内部成员结构
    obj = Children()
    res = obj.__dict__
    # __dict__ 归属是类的.所有用对象是没有办法查看类的内部成员结构的
    print(res) #所以res为空
    print(Children.__dict__)

    # __doc__ 获取对象或类的内部文档
    res = Children.__doc__
    print(res)

    '''
    输出结果:
        类的功能: 描述一个小孩
        类的成员属性: eye
        类的成员方法: sleep __beat_doudou
    '''
    # __name__ 获取类名函数名
    def myfunc():
        print("我是函数")
    obj.cry(myfunc)   # myfunc <class 'str'>
    # __class__ 获取当前对象所属的类
    res = obj.__class__
    print(res)  #<class '__main__.Children'>

    # __bases__ 获取一个类直接继承的所有父类,返回元组
    res = Children.__bases__
    print(res)

    三.反射

    概念:通过字符串去操作类对象 或者 模块中的属性方法
    (1)类中的反射
    hasattr() 检测对象/类是否有指定的成员
    getattr() 获取对象/类成员的值
    setattr() 设置对象/类成员的值
    delattr() 删除对象/类成员的值

    (2)模块的反射
    sys.modules 返回一个系统字典,字典的键是加载的所有模块

    1.类中的反射

    # (1)hasattr() 检测对象/类是否有指定的成员 [以是否能够自动调用为基准]
    #用的是二中的obj

    res = hasattr(obj, "eye")
    print(res)

    res = hasattr(Children, "eat")
    print(res)  # 返回True说明存在

    # (2)getattr() 获取对象/类成员的值
    res = getattr(obj, "eye")
    print(res)  # 蓝色的眼睛

    res = getattr(obj, "sleep")
    print(res)  # 它返回的是一个绑定方法
    res()  # 小孩喜欢睡觉

    # 类的方式
    res = getattr(Children, "eat")
    print(res)
    res()  # 小孩需要多吃有营养的东西

    res = getattr(Children, "sleep")
    print(res)  # 它不是一个绑定方法,所有一定需要用类的方式
    res(1)

    #(3)getattr 第三个参数可选如果获取不到这个值,可以添加默认提示,预防报错
    res = getattr(obj, "abc", "对不起这个真没有")
    print(res)

    # strvar = input("请输入您要调用的函数:")
    # if hasattr(obj,strvar):
    # res = getattr(obj,strvar)
    # res()

    # (3)setattr() 设置对象/类成员的值
    setattr(obj, "hair", "黑色")
    print(obj.hair)
    setattr(Children, "skin", "绿色")
    print(Children.skin)

    # (4)delattr() 删除对象/类成员的值
    delattr(obj, "hair")
    # print(obj.hair)

    delattr(Children, "skin")
    # print(Children.skin)

    2.模块的反射

    #sys.modules 返回一个系统字典,字典的键是加载的所有模块

    #3:
    import sys
    res = sys.modules
    print(res)
    print(__name__) # __main__ 是否是主文件运行
    mymodule = sys.modules[__name__]
    print(mymodule)  #打印主模块

    def func1():
        print("这是func1方法")

    def func2():
        print("这是func2方法")

    def func3():
        print("这是func3方法")

    # 用户给我字符串,我反射对应的方法调用
    while True:
        strvar = input("请输入您要调用的方法:")
        if hasattr(mymodule, strvar):
            _func_ = getattr(mymodule, strvar)
            _func_()
            # 注意这个函数会继承您输入的函数,
            # 所有如果输入_myfunc会打印上一个函数的内容,所有这个函数名取得特殊一点
        else:
            print("大哥,没有")

  • 相关阅读:
    Tools
    Python
    Python
    Python
    Python
    Python
    linux下搭建SVN服务器完全手册【摘抄】
    XPath学习:轴(14)——总结
    XPath学习:parent,child
    使用Xpath对XML进行模糊查询
  • 原文地址:https://www.cnblogs.com/hszstudypy/p/10964067.html
Copyright © 2020-2023  润新知