面向对象拾遗

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')

 

posted @ 2018-03-16 21:17  星雨5213  阅读(60)  评论(0)    收藏  举报