面向对象拾遗
1.类中的mm,调用方式有两种:
class Foo(object):
def mm(self,msg):
print('aa',msg)
方式(1):
obj1=Foo()
obj1.mm('bb')
方式(2):
obj2=Foo()
Foo.mm(obj2,'bb')
2.到底是函数还是方法(from types import MethodType,FunctionType)
类.mm--->函数(所有参数自己传递)
对象.mm-->方法(python帮助传递self)
3.callable 可调用的
class Foo(object):
def mm(self,msg):
print('aa',msg)
def __call__(self):
pass
obj=Foo()
print(callable(obj.mm)) True
print(callable(Foo.mm)) True
print(callable(obj)) True 类中需有__call__方法
4.isinstance/type区别
(1)isinstance用于判断对象是否是类或其派生类的实例
(2)type用于判断对象是否是类的实例
class Field(): pass class Charfield(Field): pass class Emailfield(Field): pass obj_list=[Charfield(),Emailfield(),dict()] # 循环obj_list,判断:如果CharField,则显示666,如果是EmailField:999,如果是dict:123 for item in obj_list: if type(item)==Charfield: print(666) elif type(item)==Emailfield: print(999) elif type(item)==dict: print(123) # 循环obj_list,判断:如果Field类的子类的对象时候显示888,如果是dict:123 for obj in obj_list: if isinstance(obj,Field): print(888) elif isinstance(obj,dict): print(123)
5.创建类的方式二
类名=type('类名',(继承什么类,),{
'__init__':函数体,
'func':lamda函数
})
6.__getattr__和__setattr__
class Foo(object): def __init__(self): object.__setattr__(self,'storage',{}) 对象.xxx 不会执行 # self.storage={} 对象.xxx会执行 def __setattr__(self, key, value): # self.storage={'k1':'v1'} print(key,value) def __getattr__(self, item): print(111111) print(item) return 'df' obj=Foo() obj.storage={'v1':'v2'} getattr(obj,'ssss','gggg')

浙公网安备 33010602011771号