知识拾遗

一、判断对象的类型方法小结:

1、       typetypeobject)获取object的类型,types模块就是用来判断相关的数据类型!

2、       dir()获取对象的所有属性和方法。

3、       hasattrgetattrsetattr使用(判断的属性都是以字符串的形式)例子如下:

  • 使用 hasattr(obj, attr) 判断对象是否具有指定属性/方法

        hasattr (tuple,'append') 

       >>>False

  • 使用 getattr(obj, attr[, default]) 获取属性/方法的值, 要是没有对应的属性则返回 default 值(前提是设置了 default),否则会抛出 AttributeError 异常;

         例子:

         getattr(list, 'append','you are wrong!')

         >>><method 'append' of 'list' objects>

         getattr(tuple,'append','i has no this')

         >>>'i has no this'

  • 使用 setattr(obj, attr, value) 设定该属性/方法的值,类似于 obj.attr=value;

4、isinstancede的使用

        isinsitance(obj,type)

         isinstance ([3,4,5] ,list)

         >>>True

 

二、元类

  • type函数来获取类型,同样也可以用该函数创造一个类,取决于参数。type(类名, 父类的元组(针对继承的情况,可以为空),包含属性的字典(名称和值))
 1 ccc=type('ccc',(),{})
 2 
 3 cc=ccc()
 4 
 5 type(cc)
 6 
 7 <class '__main__.ccc'>
 8 
 9 cc.__class__()
10 
11 <__main__.ccc object at 0x018D7530>
1 def fun():pass
2 
3 CCCC=type('CCCC',(CCC,),{'attr':True,'fun':fun})
4 
5 class CCCC(CCC):
6 
7     self.attr=True
8 
9     self.fun=fun 

实际上我们使用class关键词创建新式类时是调用了type函数来实现的。

 

三、被忽略的类方法

 1 class A(object):
 2     bar = 1
 3 
 4     @classmethod
 5     def class_foo(cls):
 6         print 'Hello, ', cls
 7         print cls.bar
 8 
 9 A.class_foo()   # 直接通过类来调用方法
10 >>>Hello,  <class '__main__.A'>
11 >>>1
  • 原来类方法中的参数是代表类本身的,当使用A.class_foo()时,cls就会接收A作为参数。另外,被 classmethod 装饰的方法由于持有 cls 参数,因此我们可以在方法里面调用类的属性、方法,比如 cls.bar。静态方法可以被类和实例进行调用,而类方法一般被类调用!

 

posted @ 2017-03-02 22:40  Jhon23  阅读(162)  评论(0编辑  收藏  举报