一、isinstance和issubclass
isinstance:判断一个对象是不是一个类的实例

class Foo()
     pass

obj=Foo()
print(isinstance(obj,Foo))     #True    #推荐使用该函数来判断一个函数的类型


print(isinstance('abc',str))    #True    #判断‘abc’是否是字符串类型

issubclass:判断Foo是不是object的子类

class Foo:
     pass

print(issubclass(Foo,object))     #True

二、反射:
通过字符串来操作类与对象的属性,这种操作称为反射
下述四个函数是专门用来操作类与对象属性的

class People:
      country='China'
      def __init__(self,name):
           self.name=name
      def tell(self):
           print('%s is aaa'%self.name)

obj=People('gao')

1.hasattr     #判断类是否有属性操作
print(hasattr(People,'country'))      #True
print('country' in People.__dict__)    #True
print(hasattr(obj,'name')                 #True

2.getattr    #拿到类的属性
f=getattr(obj,'tell',None)
print(f==obj.tell)      #True
f()                             #gao is aaa
obj.tell()                   #gao is aaa

3.setattr:    #设置类的属性
People.x=111
setattr(People,'x',111)
print(People.x)              #111

4.delattr:    #删除类的属性
def obj.name
delattr(obj,'name')
print(obj.__dict__)


三、__str__方法:如果一个类中定义了__str__方法,那么在打印对象时,默认输出该方法的返回值

class People:
      def __init__(self,name,age,sex):
           self.name=name
           self.age=age
           self.sex=sex

      def __str__(self):
           return'<名字:%s 年龄:%s 性别:%s>' %(self.name,self.age,self.sex)

obj=People('gao',18,'male')
print(obj)           #<名字:egon 年龄:18 性别:male>

 

四、__del__方法:析构方法,当对象在内存中被释放时,自动触发执行。
析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。就是要回收系统资源。

class Foo:
     def __del__(self):
            pass

五、元类:类的类就是元类

exec:三个参数
参数一:字符串形式的命令
参数二:全局作用域(字典形式),如果不指定,默认为globals()
参数三:局部作用域(字典形式),如果不指定,默认为locals()

1.我们用class定义的类使用来产生我们自己的对象的
内置元类type是用来专门产生class定义的类的

class Foo:
     pass

print(type(Foo))       #<class 'type'>

2.用内置的元类type,来实例化得到我们的类
   类的三大要素
 print(class_name,class_bases,class_dic)      #类名、基类、类的名称空间

3.__call__方法:调用对象,则会自动触发对象下的绑定方法__call__的执行,然后将对象本身当作第一个参数传给self,将调用对象时括号内的值传给*args,**kwargs

class Foo:
     def __init__(self):
          pass

     def __str__(self):
          return '1233213'

     def __del__(self):
          pass

     def __call__(self,*args,**kwargs):
          print('__call__',args,kwargs)

obj=Foo()
print(obj)         #__call__ (1, 2, 3) {'a': 1, 'b': 2, 'c': 3}

4.自定义元类:
控制类Foo的调用过程,即控制实例化Foo的过程
1.造一个空对象obj
2.调用Foo.__init__,将obj连同调用Foo括号内的参数一同传给__init__

5.单例模式:
在内存中存的值一模一样的情况下,节省空间










posted on 2018-04-17 19:46  muzinianhua  阅读(89)  评论(0编辑  收藏  举报