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

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()  # 类获取类方法调用时不需要传入参数


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

原文地址:https://www.cnblogs.com/king-home/p/10778703.html