美文网首页python热爱者
python之类的函数和变量

python之类的函数和变量

作者: 小怪兽狂殴奥特曼 | 来源:发表于2017-12-23 00:40 被阅读14次

    1.构造函数和析构函数

    类的构造函数为__init__,析构函数为__del__。这两个函数至少要有一个参数self。

    class Student:
      def __init__(self):
        pass
      
      def __del__(self):
        pass
    

    __init__和__del__都是可选的。如果用户不提供,python会提供默认的构造函数和析构函数。
    创建类的对象时会自动__init__使用del来删除对象的时候会自动调用__del__。

    1.1类的初始化参数

    __init__的参数个数决定了创建类对象时需要的参数个数。
    如果构造函数的原型为__init__(self),则类创建对象参数个数为0。创建对象时的方式为

        #类定义
        class Student:
            def __init__(self):
                pass
        #创建对象方式
        stu = Student()
    

    如果构造函数的原型为__init__(self, x),则类创建对象参数个数为1。其它以此类推。此时创建对象的方式为

        #类定义
        class Student:
            def __init__(self, x):
                pass
        #创建对象方式
        stu = Student("a")
    

    2.变量

    2.1变量的类型

    类有三种类型变量:类变量、成员变量、局部变量。先看具体的定义。
    类变量:在所有函数之外,在类之内定义。
    成员变量:在__init__函数内定义,以"self."开头。
    局部变量:非__init__函数中定义的变量或者__init__中不以"selft."开头定义的变量。除了类变量和成员变量之外的变量。
    举个例子。

    class Student:
        #类变量
        count = 0
        def __init__(self, x):
            #name是一个成员变量
            self.name = x
        def SetAge(self, y)
            #age是一个局部变量
            self.age = y
            #local_var是一个局部变量
            local_var = y
    

    2.2 类变量和成员变量的异同

    2.2.1 共同点

    • 类变量和成员变量在每个对象中都有自己的拷贝。
    • 类变量和成员变量的作用于都为整个类,通过self.xxxx即可引用

    2.2.2 区别

    成员变量更多用于存储创建对象时需要自定义赋值,而每个对象在创建时,都拥有相同初始状态的类变量。
    因此类变量更多用来存放类共有的常量,类似于C++的const变量。
    举个例子。

    class Student:
      __school = "MIT"
      def __init__(self, x):
        self.__age = x
      def GetAge(self):
        return self.__age
      def SetAge(self, a):
        self.__age = a
      def SetSchool(self, s):
        self.__school = s
      def GetSchool(self):
        return self.__school
      
    if __name__ == "__main__":
      s1 = Student(24)
      s2 = Student(20)
      print s1.GetSchool()
      print s2.GetSchool() #s1, s2都拥有默认的__school值
      
      s1.SetSchool("Yale")
      s2.SetSchool("Harvard")
      
      print s1.GetSchool()
      print s2.GetSchool() #s1, s2 的值不同,证明类变量在每个对象都有自己的存储空间
    

    2.3类变量的权限控制

    python的类没有十分明确的权限控制,默认所有非局部变量都可以在类外部直接访问。例如

    class Student:
        #类变量
        count = 0
        def __init__(self, x):
            #name是一个成员变量
            self.name = x
        def SetAge(self, y)
            #age是一个局部变量
            self.age = y
            #local_var是一个局部变量
            local_var = y
    #在类外部,我们可以这样子访问
    s = Student("jack")
    print s.count #访问类变量,OK
    print s.name #访问成员变量,OK
    print s.age #访问局部变量,出错
    print s.local_var #访问局部变量,出错
    

    2.3.1 限制访问权限

    我们可以限制外部对成员变量和类变量的访问,将其变成私有,使类无法在外部直接访问。具体方法是在类变量和成员变量前加"__"。例如

    class Student:
        __count = 0
        def __init__(self, x):
            self.__age = x
    
    #访问类变量和成员变量
    s = Student()
    print s.__count #出错
    print s.__age #出错
    

    3.函数

    3.1函数的类型

    类的函数类型分三种:成员函数、类函数、静态函数
    成员函数:函数的第一个参数为self
    类函数:用@classmethod修饰的函数
    静态函数:用@staticmethod修饰的函数
    访问方式分别为:
    成员函数:instance.member_func()
    类函数:instance.member_func()或者class_name.func()
    静态函数:跟类函数一样。
    要注意的是,静态函数是不可以访问任何成员变量和类变量的。类函数可以访问类变量和成员函数,但是不能直接访问成员变量。
    举个例子。

    class Student:
      __bar = "bar"
      def __init__(self, a):
        self.__age = a
      #成员函数
      def SetAge(self, a)
        self.__age = a
      def GetAge(self):
        return __age
      #类函数
      @classmethod
      def GetAge(cls):
        print cls.__age # 访问成员变量,出错
        print cls.__bar # 访问类变量,OK
        print cls().GetAge() # 访问成员函数,OK。注意cls的写法。
      #静态函数
      @staticmethod
      def AddAge(a, b):
        print self.__age # 不允许访问成员变量
        return a+b
      
      if __name__ == "__main__":
        s = Student(10)
        s.SetAge(20)
        print s.GetAge()
        print Student.GetAge()
        print s.AddAge(20, 21)
        print Student.AddAge(20, 21)
    

    3.2 函数的访问权限

    跟类变量一样,默认成员函数的权限为公开的。要想设置成员函数为私有,可以在函数明前加"__",即可限制为只能在类内部访问成员函数。

    参考:
    Python-类变量,成员变量,静态变量,类方法,静态方法,实例方法,普通函数
    python中的实例方法、静态方法、类方法、类变量和实例变量浅析

    相关文章

      网友评论

        本文标题:python之类的函数和变量

        本文链接:https://www.haomeiwen.com/subject/nprfgxtx.html