python基础(二十七)—面向对象进阶(一)
isinstance 对象与类之间的关系
判断第一个参数是否是第二个参数的实例
class A: pass class B: pass b = B() a = A() print(isinstance(a,A)) print(isinstance(b,A))
issubclass 类与类之间的关系
第一个参数是疑似子类,第二个参数是疑似父类,最终结果如果是父子关系则返回True,反则返回False
class A: pass class B(A): pass print(issubclass(A,B)) print(issubclass(B,A))
反射
反射的定义:通过字符串来操作python代码中的变量,函数,甚至类和方法
getattr
直接过去一个变量中的名字的值getattr(类名,属性)如果第二个参数是不存在的属性,则会报错
class A: a = 666 # def __init__(self,name,age): # self.name = name # self.age = age def b(self):pass a = A() print(getattr(A,'a')) print(getattr(A,'b'))
hasattr
判断属性是否在类中与getarrt合用
class A: a = 666 def b(self):pass a = A() print(hasattr(A,'c')) # 与getattr合用 if hasattr(A,'a'): print(getattr(A,'a'))
应用场景:网络编程
setattr(对象,属性,参数) 添加一个属性,修改一个属性
class A: a = 666 b = 777 f = A() setattr(f,'c',888) print(f.__dict__)
delattr(对象,属性) 删除一个属性
class A: a = 666 b = 777 def __init__(self,name,age): self.name = name self.age = age def fun(self):pass f = A('alex',18) delattr(f,'name') print(f.__dict__)
内置方法:是直接和python的语法隐形相关
__len__和__eq__
class A: def __init__(self): self.a = 1 self.b = 2 def __len__(self): return len(self.__dict__) a = A() print(len(a))
class A: def __init__(self): self.a = 1 self.b = 2 def __eq__(self,obj): if self.a == obj.a and self.b == obj.b: return True a = A() b = A() print(a == b)
__format__格式化输出
format_dict={ 'nat':'{obj.name}-{obj.addr}-{obj.type}',#学校名-学校地址-学校类型 'tna':'{obj.type}:{obj.name}:{obj.addr}',#学校类型:学校名:学校地址 'tan':'{obj.type}/{obj.addr}/{obj.name}',#学校类型/学校地址/学校名 } class School: def __init__(self,name,addr,type): self.name=name self.addr=addr self.type=type def __format__(self, format_spec): return format_spec.format(obj=self) s1=School('oldboy1','北京','私立') print(format(s1,format_dict['tna'])) print(format(s1,format_dict['nat'])) print(format(s1,format_dict['tan']))
__str__和__repr__
repr是str的备胎

浙公网安备 33010602011771号