关于类的总结之二

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.version
4、 经典类和新式类的区别

在语法上,经典类不继承于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、 类的私有变量

类里的私有变量以双下划线开头,或者以下划线开头即为私有变量



posted @ 2016-04-24 23:05  KEL  阅读(178)  评论(0编辑  收藏  举报