加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Python基础—11-面向对象(01)

发布时间:2020-12-17 00:23:04 所属栏目:Python 来源:网络整理
导读:h1 id="面向对象" data-source-line="1"面向对象 h3 id="面向对象-2" data-source-line="3"面向对象 ul data-source-line="5" 与面向过程对比: 面向过程:数学逻辑的映射,学会做个好员工 面向对象:生活逻辑的映射,学会做个好领导 生活实例: 类: 人 手

<h1 id="面向对象" data-source-line="1">面向对象
<h3 id="面向对象-2" data-source-line="3">面向对象
<ul data-source-line="5">

  • 与面向过程对比:
    • 面向过程:数学逻辑的映射,学会做个好员工
    • 面向对象:生活逻辑的映射,学会做个好领导
  • 生活实例:
    • 类: 人 手机 电脑
      • 对象: 我的手机、女朋友的手机 你的那部T400、老板桌上的电脑
  • 官方定义:
    • 类:具有相同特征(属性和行为)的事物的抽象
    • 对象:某个类的具象
  • 编程语言:
    • 类:是一种自定义的数据类型
    • 对象:某个类类型的变量
    • 类的定义:

    • 语法说明:

      • 定义类需要使用关键字class
      • 类名:原则上只要符合标识符命名规范即可,但是通过我们都使用大驼峰(每个单词首字母大写)风格命名
        • 如:UserName
      • 类名后面的':'不要忘记
      • 类的内容要进行整体缩进
      • 行为:通过方法体现,在类中定义相关的函数即可(第一个参数通常是self)
      • 属性:通过变量体现,在需要时动态添加,很多时候定义类时没有体现
      • 成员访问:
        • 属性:对象.属性名
        • 方法:对象.方法名()
    • 示例:

      <span style="color: #008000"&gt;#</span><span style="color: #008000"&gt; 吃饭</span>
      <span style="color: #0000ff"&gt;def</span><span style="color: #000000"&gt; eat(self):
          </span><span style="color: #0000ff"&gt;print</span>(<span style="color: #800000"&gt;'</span><span style="color: #800000"&gt;红烧排骨我喜欢吃</span><span style="color: #800000"&gt;'</span><span style="color: #000000"&gt;)
      
      </span><span style="color: #008000"&gt;#</span><span style="color: #008000"&gt; 睡觉</span>
      <span style="color: #0000ff"&gt;def</span><span style="color: #000000"&gt; sleep(self):
          </span><span style="color: #0000ff"&gt;print</span>(<span style="color: #800000"&gt;'</span><span style="color: #800000"&gt;睡觉也是一种生活态度</span><span style="color: #800000"&gt;'</span><span style="color: #000000"&gt;)

      <span style="color: #008000">#<span style="color: #008000"> 定义对象
      liang =<span style="color: #000000"> Person()
      <span style="color: #008000">#<span style="color: #008000"> 调用方法
      <span style="color: #000000">liang.eat()
      liang.sleep()
      <span style="color: #008000">#<span style="color: #008000"> 属性时动态添加的
      liang.name = <span style="color: #800000">'<span style="color: #800000">上官<span style="color: #800000">'
      <span style="color: #008000">#<span style="color: #008000"> 获取属性
      <span style="color: #0000ff">print(liang.name)

      self使用

      (</span><span style="color: #0000ff"&gt;def</span><span style="color: #000000"&gt; introduce(self): </span><span style="color: #008000"&gt;#</span><span style="color: #008000"&gt; 不但可以访问成员属性</span> <span style="color: #0000ff"&gt;print</span>(<span style="color: #800000"&gt;'</span><span style="color: #800000"&gt;我叫{}</span><span style="color: #800000"&gt;'</span><span style="color: #000000"&gt;.format(self.name)) </span><span style="color: #008000"&gt;#</span><span style="color: #008000"&gt; 还可以调用成员方法</span>

      <span style="color: #000000"> self.run()

      fei =<span style="color: #000000"> Person()
      fei.name = <span style="color: #800000">'<span style="color: #800000">欧阳<span style="color: #800000">'<span style="color: #000000">
      fei.run()
      fei.introduce()

      long =<span style="color: #000000"> Person()
      long.name = <span style="color: #800000">'<span style="color: #800000">诸葛<span style="color: #800000">'<span style="color: #000000">
      long.introduce()

      • 说明:
      1234.通过self可以访问成员属性,也可以调用成员方法

      __str__方法

      james =<span style="color: #000000"> Person()
      james.name
      = <span style="color: #800000">'
      <span style="color: #800000">勒布朗.詹姆斯
      <span style="color: #800000">'
      <span style="color: #000000">
      james.age
      = 33
      <span style="color: #0000ff">print
      (james)

      练习:

      • 自定义一个狗类,添加如下属性和方法:
        • 属性:名字、年龄、颜色
        • 方法:跑、吃、游泳、吠、描述

      构造方法:创建对象后,初始化属性时,系统会自动调用该方法

      </span><span style="color: #008000"&gt;#</span><span style="color: #008000"&gt; 构造方法:创建对象后,初始化系统就会自动调用该方法</span> <span style="color: #0000ff"&gt;def</span> <span style="color: #800080"&gt;__init__</span><span style="color: #000000"&gt;(self,name,age,color): </span><span style="color: #0000ff"&gt;print</span>(<span style="color: #800000"&gt;'</span><span style="color: #800000"&gt;__init__</span><span style="color: #800000"&gt;'</span><span style="color: #000000"&gt;) self.name </span>=<span style="color: #000000"&gt; name self.age </span>=<span style="color: #000000"&gt; age self.color </span>=<span style="color: #000000"&gt; color

      <span style="color: #008000">#<span style="color: #008000"> 这种形式比较繁琐<span style="color: #008000">

      <span style="color: #008000"> tom = Cat()<span style="color: #008000">

      <span style="color: #008000"> tom.name = 'Tom'<span style="color: #008000">

      <span style="color: #008000"> tom.age = 3<span style="color: #008000">

      <span style="color: #008000"> tom.color = '蓝色'

      <span style="color: #008000">#<span style="color: #008000"> 这种比较简洁
      tom = Cat(<span style="color: #800000">'<span style="color: #800000">Tom<span style="color: #800000">',3,<span style="color: #800000">'<span style="color: #800000">蓝色<span style="color: #800000">'<span style="color: #000000">)
      <span style="color: #0000ff">print(tom)

      析构方法:当对象释放时系统会自动调用,通常用于释放资源

      (bajie =<span style="color: #000000"> Pig()
      <span style="color: #0000ff">del
      <span style="color: #000000"> bajie
      <span style="color: #0000ff">print
      (<span style="color: #800000">'
      <span style="color: #800000">八戒,一路走好!
      <span style="color: #800000">'
      )

    • 经典示例:小明手里有两张牌,左手?K,右手?A,小明交换两手的牌后,手里分别是什么?

      • 思路:
        • 先找到对象:左手、右手、?K、?A、小明
        • 根据对象抽象出对应的类:人、手、牌
        • 根据需要写出相应的逻辑,很可能反过来完善类的设计
        • 按照题目要求创建相关对象,调用相关方法,实现相关功能
      • 代码:

      <span style="color: #008000">#<span style="color: #008000"> 扑克牌
      <span style="color: #0000ff">class<span style="color: #000000"> Poker:
      <span style="color: #0000ff">def <span style="color: #800080">init<span style="color: #000000">(self,color,number):
      self.color =<span style="color: #000000"> color
      self.number =<span style="color: #000000"> number

      </span><span style="color: #0000ff"&gt;def</span> <span style="color: #800080"&gt;__str__</span><span style="color: #000000"&gt;(self):
          </span><span style="color: #0000ff"&gt;return</span> <span style="color: #800000"&gt;'</span><span style="color: #800000"&gt;{}{}</span><span style="color: #800000"&gt;'</span><span style="color: #000000"&gt;.format(self.color,self.number) 

      <span style="color: #008000">#<span style="color: #008000"> 创建两张牌
      p1 = Poker(<span style="color: #800000">'<span style="color: #800000">?<span style="color: #800000">',<span style="color: #800000">'<span style="color: #800000">K<span style="color: #800000">'<span style="color: #000000">)
      p2 = Poker(<span style="color: #800000">'<span style="color: #800000">?<span style="color: #800000">',<span style="color: #800000">'<span style="color: #800000">A<span style="color: #800000">'<span style="color: #000000">)

      <span style="color: #008000">#<span style="color: #008000"> 手的类
      <span style="color: #0000ff">class<span style="color: #000000"> Hand:
      <span style="color: #0000ff">def <span style="color: #800080">init<span style="color: #000000">(self,poker):
      self.poker =<span style="color: #000000"> poker

      </span><span style="color: #0000ff"&gt;def</span><span style="color: #000000"&gt; hold_poker(self,poker):
          self.poker </span>=<span style="color: #000000"&gt; poker

      <span style="color: #008000">#<span style="color: #008000"> 创建左右两只手
      left_hand =<span style="color: #000000"> Hand(p1)
      right_hand =<span style="color: #000000"> Hand(p2)

      <span style="color: #008000">#<span style="color: #008000"> 人的类
      <span style="color: #0000ff">class<span style="color: #000000"> Person:
      <span style="color: #0000ff">def <span style="color: #800080">init<span style="color: #000000">(self,left_hand,right_hand):
      self.name =<span style="color: #000000"> name
      self.left_hand =<span style="color: #000000"> left_hand
      self.right_hand =<span style="color: #000000"> right_hand

      </span><span style="color: #008000"&gt;#</span><span style="color: #008000"&gt; 展示手里的牌</span>
      <span style="color: #0000ff"&gt;def</span><span style="color: #000000"&gt; show(self):
          </span><span style="color: #0000ff"&gt;print</span>(<span style="color: #800000"&gt;'</span><span style="color: #800000"&gt;{}张开手</span><span style="color: #800000"&gt;'</span>.format(self.name),end=<span style="color: #800000"&gt;'</span> <span style="color: #800000"&gt;'</span><span style="color: #000000"&gt;)
          </span><span style="color: #0000ff"&gt;print</span>(<span style="color: #800000"&gt;'</span><span style="color: #800000"&gt;左手:{}</span><span style="color: #800000"&gt;'</span>.format(self.left_hand.poker),end=<span style="color: #800000"&gt;'</span><span style="color: #800000"&gt;,</span><span style="color: #800000"&gt;'</span><span style="color: #000000"&gt;)
          </span><span style="color: #0000ff"&gt;print</span>(<span style="color: #800000"&gt;'</span><span style="color: #800000"&gt;右手:{}</span><span style="color: #800000"&gt;'</span><span style="color: #000000"&gt;.format(self.right_hand.poker))
      
      </span><span style="color: #008000"&gt;#</span><span style="color: #008000"&gt; 交换两手的牌</span>
      <span style="color: #0000ff"&gt;def</span><span style="color: #000000"&gt; swap(self):
          self.left_hand.poker,self.right_hand.poker </span>=<span style="color: #000000"&gt; self.right_hand.poker,self.left_hand.poker
          </span><span style="color: #0000ff"&gt;print</span>(<span style="color: #800000"&gt;'</span><span style="color: #800000"&gt;{}交换两手的牌</span><span style="color: #800000"&gt;'</span><span style="color: #000000"&gt;.format(self.name))   

      <span style="color: #008000">#<span style="color: #008000"> 创建小明对象
      xiaoming = Person(<span style="color: #800000">'<span style="color: #800000">小明<span style="color: #800000">'<span style="color: #000000">,right_hand)

      <span style="color: #008000">#<span style="color: #008000"> 展示手里的牌
      <span style="color: #000000">xiaoming.show()

      <span style="color: #008000">#<span style="color: #008000"> 交换两手的牌
      <span style="color: #000000">xiaoming.swap()

      <span style="color: #008000">#<span style="color: #008000">再次展示
      xiaoming.show()

    • 练习:设计一个数学类,有两个成员属性,成员方法有加、减、乘、除,展示成员。

      内置函数:在类的内部,特定时机自动触发的函数。

    • 示例:setattr、getattr、delattr

      = </span><span style="color: #0000ff"&gt;def</span> <span style="color: #800080"&gt;__str__</span><span style="color: #000000"&gt;(self): </span><span style="color: #0000ff"&gt;return</span> <span style="color: #800000"&gt;'</span><span style="color: #800000"&gt;姓名:{}</span><span style="color: #800000"&gt;'</span><span style="color: #000000"&gt;.format(self.name) </span><span style="color: #0000ff"&gt;def</span> <span style="color: #800080"&gt;__del__</span><span style="color: #000000"&gt;(self): </span><span style="color: #0000ff"&gt;print</span>(<span style="color: #800000"&gt;'</span><span style="color: #800000"&gt;对象即将销毁</span><span style="color: #800000"&gt;'</span><span style="color: #000000"&gt;) </span><span style="color: #008000"&gt;#</span><span style="color: #008000"&gt; 当获取不存在的属性时,会自动触发该方法</span> <span style="color: #0000ff"&gt;def</span> <span style="color: #800080"&gt;__getattr__</span><span style="color: #000000"&gt;(self,item): </span><span style="color: #0000ff"&gt;if</span> item == <span style="color: #800000"&gt;'</span><span style="color: #800000"&gt;age</span><span style="color: #800000"&gt;'</span><span style="color: #000000"&gt;: </span><span style="color: #0000ff"&gt;return</span> 18 <span style="color: #0000ff"&gt;else</span><span style="color: #000000"&gt;: </span><span style="color: #0000ff"&gt;return</span> <span style="color: #800000"&gt;'</span><span style="color: #800000"&gt;你猜</span><span style="color: #800000"&gt;'</span> <span style="color: #008000"&gt;#</span><span style="color: #008000"&gt; 当设置不存在的属性时,会自动触发该方法</span> <span style="color: #0000ff"&gt;def</span> <span style="color: #800080"&gt;__setattr__</span><span style="color: #000000"&gt;(self,key,value): </span><span style="color: #0000ff"&gt;print</span><span style="color: #000000"&gt;(key,value) self.</span><span style="color: #800080"&gt;__dict__</span>[key] =<span style="color: #000000"&gt; value </span><span style="color: #008000"&gt;#</span><span style="color: #008000"&gt; 销毁对象成员属性时,会自动触发该方法</span> <span style="color: #0000ff"&gt;def</span> <span style="color: #800080"&gt;__delattr__</span><span style="color: #000000"&gt;(self,item): </span><span style="color: #0000ff"&gt;print</span>(item,<span style="color: #800000"&gt;'</span><span style="color: #800000"&gt;即将销毁</span><span style="color: #800000"&gt;'</span><span style="color: #000000"&gt;)

      xiaoming = Person(<span style="color: #800000">'<span style="color: #800000">小明<span style="color: #800000">'<span style="color: #000000">)
      xiaoming.age = 20
      <span style="color: #0000ff">print<span style="color: #000000">(xiaoming.age)
      <span style="color: #008000">#<span style="color: #008000"> 存放对象的所有属性<span style="color: #008000">

      <span style="color: #008000"> print(xiaoming.dict)<span style="color: #008000">

      <span style="color: #008000"> print(xiaoming)

      <span style="color: #0000ff">del xiaoming.age

      将对象当做字典操作,特定时机会自动触发的方法

      self.[key] =</span><span style="color: #008000"&gt;#</span><span style="color: #008000"&gt; 将对象当做字典操作,根据键获取值时会触发该方法</span> <span style="color: #0000ff"&gt;def</span> <span style="color: #800080"&gt;__getitem__</span><span style="color: #000000"&gt;(self,item): </span><span style="color: #008000"&gt;#</span><span style="color: #008000"&gt; print(item)</span> <span style="color: #0000ff"&gt;return</span> self.<span style="color: #800080"&gt;__dict__</span><span style="color: #000000"&gt;.get(item) </span><span style="color: #008000"&gt;#</span><span style="color: #008000"&gt; 将对象当做字典操作,删除指定的键值对时自动触发</span> <span style="color: #0000ff"&gt;def</span> <span style="color: #800080"&gt;__delitem__</span><span style="color: #000000"&gt;(self,key): </span><span style="color: #0000ff"&gt;del</span> self.<span style="color: #800080"&gt;__dict__</span><span style="color: #000000"&gt;[key]

      xiaoming =<span style="color: #000000"> Person()

      xiaoming[<span style="color: #800000">'<span style="color: #800000">name<span style="color: #800000">'] = <span style="color: #800000">'<span style="color: #800000">小明<span style="color: #800000">'
      <span style="color: #0000ff">print(xiaoming.<span style="color: #800080">dict<span style="color: #000000">)

      <span style="color: #0000ff">print(xiaoming[<span style="color: #800000">'<span style="color: #800000">name<span style="color: #800000">'<span style="color: #000000">])

      <span style="color: #0000ff">del xiaoming[<span style="color: #800000">'<span style="color: #800000">name<span style="color: #800000">']

      将对象当做函数调用时,会自动触发下面方法

      (self,*args,** xiaoming =<span style="color: #000000"> Person()

      <span style="color: #008000">#<span style="color: #008000"> 这样操作,需要提供call方法
      ret = xiaoming(1,2,name=<span style="color: #800000">'<span style="color: #800000">小明<span style="color: #800000">'<span style="color: #000000">)
      <span style="color: #0000ff">print(ret)

      函数判断

      (self,**

      <span style="color: #0000ff">def<span style="color: #000000"> test():
      <span style="color: #0000ff">pass<span style="color: #000000">

      a =<span style="color: #000000"> A()

      <span style="color: #008000">#<span style="color: #008000"> 判断是否可调用
      <span style="color: #0000ff">print<span style="color: #000000">(callable(test))
      <span style="color: #0000ff">print<span style="color: #000000">(callable(a))

      <span style="color: #008000">#<span style="color: #008000"> 判断是否拥有'call'属性
      <span style="color: #0000ff">print(hasattr(test,<span style="color: #800000">'<span style="color: #800000">call<span style="color: #800000">'<span style="color: #000000">))
      <span style="color: #0000ff">print(hasattr(a,<span style="color: #800000">'<span style="color: #800000">call<span style="color: #800000">'<span style="color: #000000">))

      <span style="color: #008000">#<span style="color: #008000"> 判断是否是函数
      <span style="color: #0000ff">from inspect <span style="color: #0000ff">import<span style="color: #000000"> isfunction
      <span style="color: #0000ff">print<span style="color: #000000">(isfunction(test))
      <span style="color: #0000ff">print(isfunction(a))

    (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

      推荐文章
        热点阅读