• 面向对象——格式化|析构|反射


    1、__str__:

    # 格式化方法:在外界打印该对象的时被调用

    # 格式化外界直接打印改类对象的字符串表示结果

      1 class A:
      2     def __init__(self,name,age):
      3         self.name=name
      4         self.age=age
      5     def __str__(self):
      6         return '<name:%s|age:%s>'%(self.name,self.age)
      7 
      8 a=A('老王',88)
      9 print(a)#<name:老王|age:88>

    2、__del__:
    # 析构方法:在对象被销毁的时候被调用,在销毁前可以做一些事情

      1 class A:
      2     def __init__(self, name, age):
      3         self.name = name
      4         self.age = age
      5 
      6     def __del__(self):
      7 	# del会在self代表的对象被消耗的时候被调用
      8         # 我们可以在析构函数中释放该对象持有的其他资源,
      9         # 或者将一些持有资源持久化(保存到文件或数据库中)
     10         del self.name
     11 
     12 a = A('老王', 88)
     13 print(a, type(a))

    3、了解 对象.语法的内部实现

      1 class B:
      2     # 了解:对象.语法的内部实现
      3     def __setattr__(self, key, value):
      4         # print(key, value)
      5         b.__dict__[key] = value
      6         # b.__dict__[key] = value.lower()
      7         # b.__dict__['xyz'] = 'XYZ'
      8 
      9     # 了了解:将对象添加属性的方式可以同字典形式
     10     def __setitem__(self, key, value):
     11         self.__dict__[key] = value
     12 
     13 
     14 b = B()
     15 b.name = 'BBB'  # b.__dict__['name'] = 'BBB'
     16 print(b.name)
     17 
     18 b['age'] = 18
     19 print(b.age)  # 访问还是通过.语法访问

    4、反射:通过字符串与类及类的对象的属性(方法)建立关联
    反射:
        通过 字符串 来操作类与对象的属性。
        hasattr()
            判断对象或者类的属性是否存在!

        getattr()
            获取对象或者类的属性
            参数1: 对象
            参数2: '属性名'
            参数3: 默认值

        setattr()
            设置对象或者类的属性

        delattr()
            删除对象或者类的属性

    # 反射:通过字符串与类及类的对象的属性(方法)建立关联
    class A:
        num = 10
    print(hasattr(A, 'num'))
    res = getattr(A, 'num', '默认值')
    print(res)
    delattr(A, 'num')
    print(setattr(A, 'tag', 10))
    # 类的属性类来操作


    class B:
        def __init__(self, name):
            self.name = name
    print(hasattr(b, 'name'))
    print(getattr(b, 'name', '对象的属性类不能获取'))
    delattr(b, 'name')
    print(setattr(b, 'age', 18))
    # 对象的属性对象来操作


    class C:
        def fn(self):
            print('fn')

        @classmethod
        def func(cls):
            print('func')

    fn = getattr(C, 'fn')
    c = C()
    fn(c)  # 类获取对象方法调用时传入具体的对象

    obj_fn = getattr(c, 'fn') 
    obj_fn()  # 对象获取对象方法调用时不用传参

    func = getattr(C, 'func')
    func()  # 类获取类方法调用时不需要传入参数


    # 总结:
    # 类的属性用类来操作
    # 对象的属性用对象来操作
    # 方法建议使用类来操作,得到的方法调用时
    #       -- 对象的方法要传入具体的对象
    #       -- 类的方法不需要传入参数

  • 相关阅读:
    软件加载前显示加载中画面
    datatable用法
    arcsde安装
    dev gridcontrol (一)绑定值
    dev常用
    lookupedit用法(combox功能)
    关于NetBox2.8端口问题
    asp.net中,登录互斥的相关代码(不包含中途退出的处理)
    我老婆其人其事(一)
    判断文件是否为UTF8编码(以前收集的)
  • 原文地址:https://www.cnblogs.com/king-home/p/10778703.html
Copyright © 2020-2023  润新知