zoukankan      html  css  js  c++  java
  • 关于类的总结之二

    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、 类的私有变量

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



  • 相关阅读:
    java实现AVL树
    java实现队列
    java实现双向链表
    java实现堆
    swagger导出离线文档
    java实现二叉查找树
    java实现二叉树遍历
    java实现栈
    Java实现单源最短路径算法(Dijkstra 算法)
    docker安装SqlServer2019
  • 原文地址:https://www.cnblogs.com/kellyseeme/p/5525038.html
Copyright © 2011-2022 走看看