知识拾遗
一、判断对象的类型方法小结:
1、 type:type(object)获取object的类型,types模块就是用来判断相关的数据类型!
2、 dir()获取对象的所有属性和方法。
3、 hasattr、getattr、setattr使用(判断的属性都是以字符串的形式)例子如下:
- 使用 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
。静态方法可以被类和实例进行调用,而类方法一般被类调用!