面向对象-高级

一:isinstance、issubclass

isinstance(obj,class),检查实例是不是类的对象
class A:
  pass
a = A()
isinstance(a, A) >>> True

issubclass(sub, super),检查sub是否是super类的派生类
class A:
  pass
class B(A):
  pass
issubclass(B,A) >>> True

二:反射

#在python中,一切皆对象,由以下4个内置函数实现
# hasattr : 检查一个对象是否有其方法或属性等
# getattr :获取对象方法或者属性等
# setattr :设置对象方法或者属性等
# delattr :删除对象属性或者方法等

class A:
  num = 13
  def __init__(self, name,age):
    self.name = name
    self.age = age
  def test(self):
    print('输出了')
a_obj = A('tom',21)
# 检查是否含有某些属性
hasattr(a_obj, 'name') >>> True
hasattr(a_obj, 'test') >>> True

#获取属性:
test = getattr(a_obj, 'name') >>> tom
test = getattr(a_obj, 'test')() >>> 调用了test()

#设置
setattr(a_obj,'sex','man') >>设置了 sex 属性
setattr(a_obj,'result', lambda self:self.num + 1) >>设置了一个匿名函数

# 删除属性
delattr(a_obj,'sex')
delattr(a_obj,'result')

#类也是对象
getattr(A, 'num')
getattr(A, 'test')
#反射当前模块的成员
import sys
def a():
  pass
def b():
  pass
modul = sys.modules[__name__]
getattr(modul, 'a')
hasattr(modul,'b')

三:__setattr__ , __delattr__ , __getattr__

#__setattr__ :当添加或者修改的时候,自动触发
#__delattr__ :当删除属性的时候,自动触发
#__getattr__ :当找不到属性的时候,自动触发
class A:
  def __init__(self, name):
    self.name = name
  def __getattr__(self, item):
    print('找不到了吧,我运行了')
  def delattr(self, item):
    #del self.item 这么做是不对的,会无限的触发这个函数,等同于递归了
    self.__dict__pop(item) #这样做才是对的
  def __setattr__(self, key, value):
    # slef.key = value 这么做是不对的,会无限的触发这个函数,等同于递归了
    self.__dict__[key] = value

# 触发 __setattr__
a = A('tom')
a.x = 50

#触发 __delattr__
del a.name

#触发__getattr__
a.abcde

四:重新加工Python的标准类型

class List(list);
  def append(self, number):
    try:
      if number.isdigit():
        pass
      elif type(number) in int:
        super().append(number)
      else:
        raise TypeError('该数值既不是数字型字符串也不是int型数值')
    except Attribute:
       super().append(int(number))
  @propety
  def start(self):
    return self[0]
  @propety
  def end(self):
    return self[len(self) - 1]
l = List([1,2,3])
l.append('2') # 会将字符2转换成int,再添加进列表里
print(l) >>> 1,2,3,2
l.clear() #由于继承了List类,所以拥有这个方法
加上权限限制1:
class List(list);
  def __init__(self,lists, status=False)
    super().__init__(self,lists)
    self.status = status
  def append(self, number):
    try:
      if number.isdigit():
        pass
      elif type(number) in int:
        super().append(number)
      else:
        raise TypeError('该数值既不是数字型字符串也不是int型数值')
    except Attribute:
       super().append(int(number))
  @propety
  def start(self):
    if self.status in False:
      raise TypeError('没有权限操作')
    return self[0]
  @propety
  def end(self):
    return self[len(self) - 1]
l = List([1,2,3])
#l.statr 没有权限,抛异常
l.status = True
l.start #成功运行
加上权限限制2:
class List;
  def __init__(self, item,  authority=False):
    self.item = item
    slef.authority = authority
  def append(self,num):
    if self.authority in False:
      raise PermissionError('没有权限这么做')
    self.item.append(num)
  def __getattr__(self, mem):
    return getattr(self.item, mem)
  def __str__(self): # 这个函数会被print()函数触发,自动运行。只用于显示
    return str(self.item)
l = List([1,2,3])
#l.append(4) #没有权限这么做
l.authority = True
l.append(4) #成功
print(l)
l.clear()

---恢复内容结束---

猜你喜欢

转载自www.cnblogs.com/jbzd/p/9227992.html
今日推荐