一:对象类型判断
python中判断一个对象的类型的方法:type() isinstance()
import types # type() def func(): pass class Animal: pass class Dog(Animal): pass class Husky(Dog): pass ha1 = Husky() print(type(func) == types.FunctionType) print(type(sum) == types.BuiltinFunctionType) # <class 'builtin_function_or_method'> print(type(sum) == types.BuiltinMethodType) print(type(123) == int) print(type('abc') == str) print(type([1,3,5]) == list) print(type(ha1) == Husky) # isinstance()除了用来判断基本的类型,还可以判断继承关系中的类的类型 # 推荐优先使用 isinstance() 方法来判断某个对象的类型 print(isinstance(ha1,Husky)) print(isinstance(ha1,Dog)) print(isinstance(ha1,Animal)) print(isinstance(func,types.FunctionType)) print(isinstance(sum,types.BuiltinFunctionType)) print(isinstance(123,int)) print(isinstance('abc',str)) print(isinstance([1,3,5],list)) print(isinstance(123,(str,list,set,dict,int))) # 可以元组的形式判断变量是否是某些类型中的一种
二:类的成员
类的成员可以分为三大类:字段,方法 和 属性
class ClassMember: language = 'python' # 静态字段 属于类 def __init__(self,name,price,discount): self.name = name # 普通字段 属于对象 self.__price = price # 普通字段中的私有字段 在面向对象(一)访问限制那有具体介绍 self.__discount = discount def ord_func(self): # 普通方法 pass @classmethod # 调用装饰器定义类方法;类方法是给类用的 def class_func(cls): pass @staticmethod # 调用装饰器定义静态方法;和传参数self的普通方法,传cls参数的类方法区分开来的方法 def static_func(): pass @property # 调用装饰器property 定义属性;经典类只有这种装饰器,没有以下两种 def price(self): return self.__price * self.__discount @price.setter # obj1.price = value def price(self,value): self.__price = value @price.deleter def price(self): # 为 obj1.price 设置 del方法 del self.__price def double_price(self): return self.__price * 2 double_price = property(double_price) # 采用静态字段方式定义属性 obj1 = ClassMember('int',1000,0.7) print(obj1.price) # 700 obj1.price = 2000 print(obj1.price) # 1400 print(obj1.double_price) # 4000 del obj1.price print(obj1.__dict__) # {'name': 'int', '_ClassMember__discount': 0.7}
三:反射--通过字符串的形式操作对象的相关成员
# 查看一个对象所拥有的所有属性和方法 dir(object) 以列表的形式返回所有属性和方法 class Animal: name = 'animal' def run(self): pass class Dog(Animal): pass class Husky(Dog): pass ha1 = Husky() print(dir(ha1)) print(dir('abc')) print(hasattr(ha1,'name')) # 判断对象是否有某个属性 # print('name' in ha1.__dict__) print(hasattr(ha1,'run')) # 也可用于判断对象是否有某个方法 print(getattr(ha1,'name')) # 获得对象的某个属性的值;若该属性不存在会报错 print(ha1.name) setattr(ha1,'age','18') # 设置对象的某个属性 # ha1.age = 18 print(getattr(ha1,'age',None)) # 第三个参数为默认值,若对象不存在某个属性则返回该默认值 delattr(ha1,'age') print(getattr(ha1,'age',None))
四:类的内置方法
# __str__ 控制打印对象时的输出内容与格式 # __call__ 在对象被调用时触发执行;obj() 就是调用对象 class Foo: ''' 类的文档注释 ''' def __init__(self,name,age): self.name = name self.age = age def __str__(self): return 'name:%s age:%s' %(self.name,self.age) def __call__(self, *args, **kwargs): print(self.name,self.age,args,kwargs) rock = Foo('rock',18) print(rock) # name:rock age:18 print(rock.__doc__) # 类的文档注释 rock(1,2,3,a=1,b=2,c=3) #调用对象 rock 18 (1, 2, 3) {'a': 1, 'b': 2, 'c': 3}
# __del__ 在对象执行删除操作时触发执行;主要用于回收系统资源(析构函数) class MyOpen: def __init__(self,filepath,mode='r',encoding='utf-8'): self.filepath = filepath self.mode = mode self.encoding = encoding self.open = open(filepath,mode=mode,encoding=encoding) def __del__(self): # 对象f删除前将系统中打开的文件资源回收 self.open.close() f = MyOpen('a1.txt') print(f.open.read())
class Foo(dict): def __init__(self,**kwargs): super().__init__(**kwargs) # 当默认属性访问失败并出现AttributeError时调用 # 此方法应该返回(计算)的属性值或引发AttributeError异常。 def __getattr__(self, item): return self[item] # 在分配新属性时调用;key是属性名,value是属性值 def __setattr__(self, key, value): self[key]=value # 在执行删除属性时调用;即执行del obj.name 时触发 def __delattr__(self, item): print('SB') f1 = Foo(name='rock',age=18) print(f1.name) # rock f1.hobby = 'coding' # 此时会触发__setattr__的执行 print(f1.hobby) # coding del f1.name # SB print(f1.name) # rock