python之类的函数和变量

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,290评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,107评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,872评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,415评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,453评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,784评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,927评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,691评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,137评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,472评论 2 326
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,622评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,289评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,887评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,741评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,316评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,490评论 2 348

推荐阅读更多精彩内容