python热爱者

python之类的函数和变量

2017-12-23  本文已影响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 共同点

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中的实例方法、静态方法、类方法、类变量和实例变量浅析

上一篇下一篇

猜你喜欢

热点阅读