• devi into python 笔记(四)python的类


    import 与 from ... import ...:

    #types只是一个包,FunctionType只是这个包里的一个函数。这里用它来演示
    import types
    #如果要用FunctionType(),则要这样
    print types.FunctionType
    
    #如果不想每次都写types前缀,就可以用from  import
    from types import FunctionType
    print FunctionType
    
    #高端一点的说法是,from import会把FunctionType添加到当前的 命名空间 中
    #这样就可以直接使用了,不然的话就要每次都指定来源
    #不提倡使用from import *,尤其是项目比较大,模块比较多的时候,这样做虽然可以减少每次写前缀的次数
    #但是很难知道函数等的来源,不好管理,出错的话调试起来很麻烦

    =====================

    class 类:

    #python类
    class A():
        #__init__类似Java的构造函数,声明类的实例时自动执行,不返回任何东西
        #参数self:类中的方法声明时都要默认有一个参数,并且是第一个位置(不是类的函数就不用写了)
        #self代表这个类本身。虽然在函数声明时必须有self,但调用时是不用传参数的
        def __init__(self):
            pass
        def myFunc(self, vara):
            return 'this is myfunction %s' % vara
    #实例化
    a = A()
    #调用类的方法时不用为self传参数,直接传你自己的参数就行了
    a.myFunc('hello')
    
    #python继承
    #把父类放在类名后的括号里就可以了,这里是B继承了A。B是子类,A是父类
    class B(A):
        def __init__(self):
            #继承的意义在于可以把父类的能力扩展到子类上
            #那么就应该在初始化子类的时候把这些初始配置在__init__中做好
            #python要求手动显式的调用父类的__init__来完成初始化
            A.__init__()
    #另外python不支持任何形式的函数重载,比如参数数量啊,参数类型啊,在python这儿都不好使。
    #总之就是不支持。一个函数就是一个函数,没多的。

    ================

    其他特殊方法(以两个下划线开始的函数,如__init__):

    class A():
        def __init__(self):
            pass
    
        #返回一个对象的字符串表示,当时用repr()函数是,其实际执行的是__repr__
        def __repr__(self):
            return 'this is repr func'
    
        #比较两个对象‘大小’,调用cmp()时执行__cmp__
        def __cmp__(self, var):
            #self是第一个对象,var是第二个对象。这里可以自己处理逻辑
            #然后返回0相等,小于0 self小于var,大于0self大于var
             pass
    
        #返回对象长度,调用len()时执行这个__len__
        def __len__(self):
            return 5
    
    a = A()
    #这里调用repr,会执行a的__repr__方法
    print repr(a)
    
    #这里生命aa,然后a和aa比较,执行a的__cmp__方法,方法里面只写了pass站位,没有实际逻辑处理
    aa = A()
    print cmp(a, aa)
    
    #这里调用len,会执行a的__len__方法
    print len(a)

    注意:Java中的 == 比较的是地址,对应到python应该是 is ,而Java中的equals比较对象的内部的值,对应到python应该是 ==....:

    a = 1
    b = 1
    print a is b, a == b

    ================================

    类属性(对应Java的静态变量,很贴切):

    """
    Java中的静态变量(在Pyhton中叫类属性)和实例变量(Python中叫数据属性)的区别是用static关键字区分的。在Python中则是按照声明的位置区分。
    类属性紧跟类声明,而数据属性则只能出现在__init__()方法中。
    """
    class B():
        #var1紧跟在类声明后,这是类属性。这意味着所有B的实例个共同维护var1(同Java的static)
        var1 = 1
        def __init__(self):
            #var2在__init__函数中声明,var2是数据属性,实例自己改动不会影响其他实例
            self.var2 = 2

    ==================================

    类的私有公有(Python没有protect类型):

    """
    私有函数不可以从它们的模块外面被调用
    私有类方法不能够从它们的类外面被调用
    私有属性不能够从它们的类外面被访问
    """
    
    #一个Python函数,方法,或者属性是私有还是公有,完全取决于它的名字
    """
    如果一个函数,方法或属性的名字是以两个下划线开始,但不是结束,他就是私有的。其他都是公有。
    如果尝试在不允许的位置调用私有的东西会报错,提示没有这个东西,但其实是有的,只不过他是私有的
    """
  • 相关阅读:
    vscode调试pomelo和pomelo使用vscode调试
    linux修改单个进程的系统时间
    python之路目录
    python之前端
    python之ORM操作
    python之redis和memcache操作
    python之消息队列
    python之协程与IO操作
    python之进程与线程
    python之网络编程
  • 原文地址:https://www.cnblogs.com/lipijin/p/3165965.html
Copyright © 2020-2023  润新知