Python--类和对象学习

一、面向对象编程概述

1、面向对象编程(OOP)

  • 面向对象:以具体的事物(对象)为单位,考虑它的属性(特征)及动作(行为),关注整体。java、c#也是面向对象编程。

  • 例子解读(把大象装进冰箱):为了把大象装进冰箱,需要做三个动作(行为)。每个动作有一个执行者,它就是对象,这里对象是冰箱。

    1. 冰箱,你给我把门打开(冰箱.开门())
    2. 冰箱,你给我把大象装进去(冰箱.装大象())
    3. 冰箱,你给我把门关上(冰箱.关门())
      依次做这些动作,就能把大象装进冰箱。
  • 三大特征

    (1)封装(信息隐蔽技术):类的封装、函数封装,方便调用。

    #创建一个list1列表对象,我们不需知道列表对象里方法的具体实现过程,封装好了,用方法名直接调用即可
    >>>list1 = [1,5,2,6]
    >>>list1.append(10)
    >>>list1
    [1,5,2,6,10]
    >>>list1.sort()
    [1,2,5,6,10]
    

    (2)继承:子类继承父类的方法和属性

    #创建一个Mylist类,继承list类的属性和方法
    class Mylist(list):
      pass
    
    >>>list2 = Mylist()
    >>>list2.append(4)
    >>>list2.append(5)
    >>>list2.append(6)
    >>>list2
    [4,5,6] 
    

    类名后面紧接着是(object),表示该类是从哪个类继承下来的。通常,如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类。

    (3)多态:不同对象对同一方法响应不同的行动,而无需明确知道这个对象是什么。即一个方法,多种形态,就是多态。

    class Person(Object):
      def func(self):
          print('我是人!')
    class Girl(Person):
      def func(self):
          print('我是妹子!')
    class Boy(Person):
      def func(self):
          print('我是汉子!')
    def func1(x): #涉及知识点:静态/动态类型语言,file-like object,“鸭子类型”(duck typing)
      x.func()
    
    >>>a = Person()
    >>>b = Girl()
    >>>c = Boy()
    >>>a.func1()
    我是人!
    >>>b.func1()
    我是妹子!
    >>>c.func1()
    我是汉子!
    

2、面向过程编程

  • 面向过程:以一个具体的流程为单位,考虑它的实现方法,关心的是功能的实现(耦合性比较强)。C语言是面向过程编程。

  • 例子解读(把大象装进冰箱):为了把大象装进冰箱,需要3个过程。

    1. 把冰箱门打开(得到打开门的冰箱)
    2. 把大象装进去(打开门后,得到里面装着大象的冰箱)
    3. 把冰箱门关上(打开门、装好大象后,获得关好门的冰箱)
      每个过程有一个阶段性的目标,依次完成这些过程,就能把大象装进冰箱。

3、类和对象

  • 类是对一组具有相同特性(属性)和相同行为(方法)的事物的概括,是抽象的模板;对象是客观世界实际存在的事物都是一个对象,即“万物万事皆对象”。对象=属性+方法

  • 类是对象的模板,对象是类的实例

    #定义一个人类Person,类名首字母要大写
    class Person:
          def __init__(self,name,sex,age):
          self.name=name     #name,sex,age是类的属性
          self.sex=sex
          self.age=age 
      #定义类的方法
          def introduce(self):
              print('大家好,我叫%s,%s,今年%s岁'%(self.name,self.sex,self.age))
          def eat(self):
          print('%s:好饿了,想吃大餐,毕竟吃饱了,才有力气减肥,嘻嘻'%self.name)
          def run(self):
          print('%s:运动让人快乐,跑步走起!'%self.name)
          def sleep(self):
          print('%s:不嗨了,早睡早起身体棒!'%self.name)
    
    #实例化,创建一个对象
    >>>xiao_ming = Person('李小明','男','24')
    #调用Person类的方法
    >>>xiao_ming.introduce()
    大家好,我叫李小明,男,24岁
    >>>xiao_ming.eat()
    李小明:好饿了,想吃大餐,毕竟吃饱了,才有力气减肥,嘻嘻
    
  • 拓展

    1、什么是类、类对象、实例对象?

     #这是一个类,定义完之后也是一个类对象
     class C:  
         count=0
     -----------------------------------------
     >>>a=C() #a、b、c是实例对象
     >>>b=C()
     >>>c=C()
     >>>a.count
     0
     >>>b.count
     0
     >>>c.count
     0
     ---------------------------------------
     >>>c.count+=10  #实例对象覆盖了类对象里的属性
     >>>c.count
     10
     >>>a.count
     0
     >>>b.count
     0
     ---------------------------------------
     >>>C.count+=100
     >>>C.count
     100
     >>>a.count
     100
     >>>b.count
     100
     >>>c.count
     10
    
    graph TB
    task1("类定义 C")-->task2("类对象 C")
    task2-->task3("实例对象 a")
    task2-->task4("实例对象 b")
    task2-->task5("实例对象 c")
    

二、self是什么

  • 类的定义里,self会出现在函数的第一个参数里(python的默认要求,必填参数,这是与普通函数的一个区别),通过哪个对象调用的方法,则self就是哪个对象

  • 例子解读:(还是用上述Person类)

    #实例化,创建xiao_ming对象
    >>>xiao_ming = Person('李小明','男','24')
    #通过xiao_ming这个对象来调用introduce方法
    >>>xiao_ming.introduce()
    大家好,我叫李小明,男,今年24岁
    
    #实例化,创建zhangli对象
    >>>zhangli = Person('张丽','女','18')
    #通过zhangli这个对象来调用introduce方法
    >>>zhangli.introduce()
    大家好,我叫张丽,女,今年18岁
    

    def introduce(self):

    ​ print('大家好,我叫%s,%s,今年%s岁'%(self.name,self.sex,self.age))

    当对象xiao_ming调用introduce()方法时,self会调用xiao_ming的name,sex,age属性作为参数输入,然后print对应格式输出自我介绍;而zhangli这个对象调用introduce()时,则传入的是zhangli的name,sex,age。

三、访问限制:公有与私有

  • C++中,用public和private标识公有变量与私有变量,而在python中,默认情况下,对象的属性、方法都为公有的,用.点操作符来访问

    class Car:
          name = '本田' 
    >>>c1 = Car()
    >>>c1.name #用.点操作符来访问
    '本田'
    >>>c1.name = '丰田' #外部可自由修改c1实例的name属性
    >>>c1.name
    '丰田'
    
  • 若要实现类似于私有变量的特征,python内部采用了一种叫做name mangling名字改编的技术。在python中定义私有变量,只需在变量名或函数名前加上两个下划线"__",则该函数或变量就会变为私有,只有内部可以访问,外部不能访问。

    class Car:
          __name = '本田' #定义成私有变量 
    >>>c1 = Car()
    >>>c1.name #直接用点操作符访问,会报错,属于外部调用
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'Car' object has no attribute 'name'
    >>>c1.__name #也会报错
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'Car' object has no attribute '__name'
    

    在外部,私有变量”被隐藏“起来了,不能访问。理论上,若要访问私有变量,可通过在类中定义方法getname,内部调用来访问:

    class Car:
      __name = '本田'
      def getname(self):
        return self.__name
    >>>c2 = Car()
    >>>c2.__name  #仍会报错
    >>>c2.getname() #成功运行,此时的getname()是在内部调用name属性
    '本田'
    #注意一下下面这种错误的修改私有变量方式
    >>>c2.__name = '丰田'
    #表面上看,外部代码“成功”地修改了__name变量,但实际上这个__name变量和class内部的__name变量不是一个变量!
    >>>c2.__name
    '丰田'
    >>>c2.getname()#返回class内部self.__name
    '本田'
    

    虽然上述代码成功运行,而实际上,私有变量只是名字重整,被python改了名字,变为了类名_变量名而已。其实python是伪私有机制,python的类是无权限控制的,变量可被外部调用。

    >>>c2._Car__name #还是用.操作符,对象._类名__变量名即可
    '本田'
    
  • 注意:

    1、不同版本的Python解释器可能会把__name改成不同的变量名,不一定是_Car__name

    2、在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量(魔法方法),特殊变量是可以直接访问的,不是private变量。所以,不能用__name____score__这样的变量名来定义私有变量。

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

推荐阅读更多精彩内容