关于类的总结之二
1、 类中的特殊方法
在类里面有俩构造器方法:一个是init方法,一个是new方法
#!/usr/bin/env python class Kel(object): def __init__(self,name): self.name = name print 'excuting the init method',self def __new__(cls,name): print 'excuting the new method',cls return super(Kel,cls).__new__(cls,name) kel = Kel()
init和new都属于构造器方法,但是在同时存在init方法和new方法的时候,先执行new方法,然后执行init方法,以上执行结果如下:
[root@python 424]# python testinitiate.py excuting the new method <class '__main__.Kel'> excuting the init method <__main__.Kel object at 0x7f9cfddea190>两者的参数个数是相同的,但是一个参数为self表现为实例,一个参数为cls表现为类,在init方法中,是类方法,而在new方法中,属于类方法,从而传递的参数为cls。
init方法主要是在实例创建完成之后,给实例添加相应的属性;
new方法主要是控制实例的生成,要生成什么样的实例,属于类级别的方法。
解构器方法:__del__方法
解构器方法只会被调用一次,一旦引用计数为0 的时候,则对象就被清除了。
在使用解构器方法的时候,注意:
del x,不表示__del__方法被调用了,仅仅只是减少了引用计数;要调用父类的__del__方法,不要实现自己的__Del__方法
2、 函数和方法的区别
函数:表示为function,主要在模块中使用
方法:表示为method,主要在类中使用,在类中定义的def表示为方法,和对象有绑定关系
两者的语法相同,都为def进行定义
3、 实例属性
a、 在构造器中设置实例属性,init方法是实例创建后第一个被调用的方法,在这里可以设置相关的实例属性
b、 默认参数提供默认的实例安装,默认参数最好是不变的对象,而list和dictionary的可变对象可以作为静态数据
c、 在实例化时,可变长度参数也是一个好的特性
d、 查看实例属性时,使用dir()内建函数或者使用__dict__的特殊属性,在使用dict的时候,是实例属性构成的一个字典,仅有实例属性,没有类属性或者特殊属性
#!/usr/bin/env python class HotelRoomCalc(object): 'Hotel room rate claculator' def __init__(self,rt,sales=0.085,rm=0.1): 'HotelRoomCalc default arguments:sales and rm' self.salesTax = sales self.roomTax = rm self.roomRate = rt def clacToral(self,days=1): 'Calculate total:default to daily rate' daily = round((self.roomRate * 14 * (1 + self.roomTax + self.salesTax)),2) return float(days) * daily sfo = HotelRoomCalc(299) print sfo.clacToral() print sfo.clacToral(2)如上代码所示,在init方法中进行初始化实例属性,并且设置了几个默认参数,在方法中可以看到使用实例属性来进行计算。
>>> from hotel import HotelRoomCalc >>> dir(HotelRoomCalc) ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__',
'__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'clacToral'] >>> HotelRoomCalc(299).__dict__
{'roomRate': 299, 'roomTax': 0.1, '_kel': 'private', 'salesTax': 0.085}
3、 类属性
类属性包括数据属性和函数属性,类属性仅与其被定义的类相绑定。
数据属性为静态变量,而函数属性,表示数据是他们所属类,对象绑定的,不依赖于任何实例
查看类属性的时候可以使用dir和class.__dict__,在这个时候可以看到类的特殊属性,如下所示:
{'__module__': '__main__', 'clacToral': <function clacToral at 0x7f45937fb0c8>,
'__dict__': <attribute '__dict__' of 'HotelRoomCalc' objects>, '__weakref__': <attribute '__weakref__' of 'HotelRoomCalc' objects>,
'__doc__': 'Hotel room rate claculator', '__init__': <function __init__ at 0x7f45937fb050>}类属性的持久性:任凭整个实例如何改变,类属性都是独立于实例属性的,实例属性可以对类属性进行屏蔽作用:
class HotelRoomCalc(object): 'Hotel room rate claculator' version = 1.0 def testClassAttribute(self): print HotelRoomCalc.version version = 3.1 print version #使用的是局部的属性 print HotelRoomCalc.version HotelRoomCalc.version += 1 #会影响后面新建实例的属性,都会发生改变 print HotelRoomCalc.version4、 经典类和新式类的区别
在语法上,经典类不继承于cobject,而新式类继承于object;
父类的搜索算法不同,经典类属于深度优先,而新式类属于广度优先,从而新式类更加合适现在的类定义,在进行定义的时候,最好都使用新式类
5、 类的内建函数
issubclass(sub,super)——用来判断一个类是不是另外一个或者几个类的父类,super可以是多个类组成的tuple,只要一个满足,返回为True
isinstance(obj1,obj2),布尔函数判定一个对象是不是一个类或者几个类的实例,第二个参数必须为类
属性的内建函数:
hasattr()是否具有属性,getattr()获得属性,setattr(),设置属性 delattr()删除属性
super(),用来找出相应的父类,然后调用相关的属性
__Str__(self)用来进行str函数和print输出
__repr__(self)用来repr输出,也就是 %r的输出内容
6、 类的私有变量
在类里的私有变量以双下划线开头,或者以下划线开头即为私有变量