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

Python基础—12-面向对象(02)

发布时间:2020-12-17 00:23:03 所属栏目:Python 来源:网络整理
导读:h1 id="面向对象" data-source-line="1"面向对象 h3 id="面向对象三大特点" data-source-line="3"面向对象三大特点 ul data-source-line="5" 封装:既可对数据结构进行封装,又可对处理数据的方法进行封装 继承:强调的父子类的关系 多态:不同对象调用相同

<h1 id="面向对象" data-source-line="1">面向对象
<h3 id="面向对象三大特点" data-source-line="3">面向对象三大特点
<ul data-source-line="5">

  • 封装:既可对数据结构进行封装,又可对处理数据的方法进行封装
  • 继承:强调的父子类的关系
  • 多态:不同对象调用相同的方法,会有不同的响应
    • 相关概念

      • 继承:父类的属性和方法,子类直接拥有,称为继承
      • 派生:子类在父类的基础上衍生出新的特征(属性和行为)
      • 总结:其实他们是一回事,只是描述问题的侧重点不同(继承强调相同点,派生强调不同点)
    • 继承语法

      =</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 style="color: #008000">#<span style="color: #008000"> 继承自Animal
      <span style="color: #0000ff">class<span style="color: #000000"> Dog(Animal):
      <span style="color: #0000ff">pass<span style="color: #000000">

      d = Dog(<span style="color: #800000">'<span style="color: #800000">旺财<span style="color: #800000">'<span style="color: #000000">)
      <span style="color: #008000">#<span style="color: #008000"> 可以拥有父类的方法
      <span style="color: #000000">d.eat()
      <span style="color: #008000">#<span style="color: #008000"> 也可以拥有父类的属性
      <span style="color: #0000ff">print(d.name)

    • 派生示例

      (<span style="color: #0000ff">class<span style="color: #000000"> Cat(Animal):
      <span style="color: #0000ff">def
      <span style="color: #000000"> eat(self):
      <span style="color: #0000ff">print
      (<span style="color: #800000">'
      <span style="color: #800000">猫喜欢吃老鼠
      <span style="color: #800000">'
      <span style="color: #000000">)

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

      tom.run()
      <span style="color: #008000">#<span style="color: #008000"> 多出来的行为
      <span style="color: #000000">tom.eat()

      <span style="color: #008000">#<span style="color: #008000"> 多出来的属性
      tom.color = <span style="color: #800000">'<span style="color: #800000">蓝色<span style="color: #800000">'
      <span style="color: #0000ff">print(tom.color)

    • 重写方法

      • 若父类的方法完全不合适,可以进行覆盖重写
      • 若父类的方法不够完善,可以添枝加叶进行完善
      • 示例:
      (</span><span style="color: #0000ff"&gt;def</span><span style="color: #000000"&gt; run(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: #0000ff">class<span style="color: #000000"> Cat(Animal):
      <span style="color: #008000">#<span style="color: #008000"> 父类的方法完全不合适,覆盖重写
      <span style="color: #0000ff">def<span style="color: #000000"> run(self):
      <span style="color: #0000ff">print(<span style="color: #800000">'<span style="color: #800000">俺走的是猫步<span style="color: #800000">'<span style="color: #000000">)

      </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; eat(self):
          </span><span style="color: #008000"&gt;#</span><span style="color: #008000"&gt; 保留父类的内容,不建议使用此方式</span>
          <span style="color: #008000"&gt;#</span><span style="color: #008000"&gt; Animal.eat(self)</span>
          <span style="color: #008000"&gt;#</span><span style="color: #008000"&gt; super(Cat,self).eat()</span>
          <span style="color: #008000"&gt;#</span><span style="color: #008000"&gt; 类名及self可以不传</span>

      <span style="color: #000000"> super().eat()
      <span style="color: #0000ff">print(<span style="color: #800000">'<span style="color: #800000">不过俺喜欢吃鱼<span style="color: #800000">'<span style="color: #000000">)

      jiafei =<span style="color: #000000"> Cat()
      jiafei.run()
      jiafei.eat()

    • 多继承:一个子类可以拥有多个父类

      (<span style="color: #0000ff">class<span style="color: #000000"> B:
      <span style="color: #0000ff">def
      <span style="color: #000000"> eat(self):
      <span style="color: #0000ff">print
      (<span style="color: #800000">'
      <span style="color: #800000">eat func in class B
      <span style="color: #800000">'
      <span style="color: #000000">)

      <span style="color: #0000ff">class<span style="color: #000000"> C(A,B):
      <span style="color: #0000ff">def<span style="color: #000000"> eat(self):
      <span style="color: #008000">#<span style="color: #008000"> 这种方案是默认的继承顺序进行选择的父类方法
      <span style="color: #008000">#<span style="color: #008000"> super().eat()
      <span style="color: #008000">#<span style="color: #008000"> 人为指定调用某个父类的方法
      <span style="color: #000000"> B.eat(self)

      c =<span style="color: #000000"> C()
      c.eat()

      权限

      • 公有的:类中的普通的属性和方法,默认都是公有的;可以在类内、类外、子类中使用
      • 私有的:定义时在前面添加两个'_',就变成了私有的;只能在类内使用,不能在类外及子类中使用
    • 示例:

      = = 20
      <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: #0000ff"&gt;def</span> <span style="color: #800080"&gt;__test</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;__test</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">)
      <span style="color: #0000ff">print<span style="color: #000000">(xiaoming.name)
      xiaoming.eat()
      <span style="color: #008000">#<span style="color: #008000"> 不能在类外使用
      <span style="color: #0000ff">print(xiaoming.<span style="color: #800080">age<span style="color: #000000">)
      xiaoming._Person__test()
      <span style="color: #0000ff">print<span style="color: #000000">(xiaoming.dict)
      <span style="color: #008000">#<span style="color: #008000"> 尽管可以这样访问私有属性,但是强烈建议不要这样使用
      <span style="color: #0000ff">print<span style="color: #000000">(xiaoming._Person
      age)

      <span style="color: #0000ff">class<span style="color: #000000"> Man(Person):
      <span style="color: #0000ff">def<span style="color: #000000"> introduce(self):
      <span style="color: #008000">#<span style="color: #008000"> 不能在子类中使用
      <span style="color: #008000">#<span style="color: #008000"> print(self.__age)
      <span style="color: #0000ff">print(<span style="color: #800000">'<span style="color: #800000">我叫{}<span style="color: #800000">'<span style="color: #000000">.format(self.name))
      self.eat()

      m = Man(<span style="color: #800000">'<span style="color: #800000">诸葛<span style="color: #800000">'<span style="color: #000000">)
      m.introduce()

      说明:定义类时,写在方法外的属性,通常会写在类的开头,这样的属性称为类属性

    • 示例:

        <span style="color: #008000"&gt;#</span><span style="color: #008000"&gt; 限制可以使用的属性,提高访问的效率</span>
        <span style="color: #008000"&gt;#</span><span style="color: #008000"&gt; 也可以提高访问速度,减少内存使用</span>
        <span style="color: #800080"&gt;__slots__</span> = (<span style="color: #800000"&gt;'</span><span style="color: #800000"&gt;name</span><span style="color: #800000"&gt;'</span>,<span style="color: #800000"&gt;'</span><span style="color: #800000"&gt;age</span><span style="color: #800000"&gt;'</span>,<span style="color: #800000"&gt;'</span><span style="color: #800000"&gt;nation</span><span style="color: #800000"&gt;'</span><span style="color: #000000"&gt;)
      
        </span><span style="color: #0000ff"&gt;def</span> <span style="color: #800080"&gt;__init__</span><span style="color: #000000"&gt;(self,name):
            self.name </span>=<span style="color: #000000"&gt; name
            self.nation </span>= <span style="color: #800000"&gt;'</span><span style="color: #800000"&gt;china</span><span style="color: #800000"&gt;'</span><span style="color: #000000"&gt;

      p1 = Person(<span style="color: #800000">'<span style="color: #800000">小明<span style="color: #800000">'<span style="color: #000000">)
      p2 = Person(<span style="color: #800000">'<span style="color: #800000">小红<span style="color: #800000">'<span style="color: #000000">)
      <span style="color: #0000ff">print<span style="color: #000000">(p1.name,p2.name)
      <span style="color: #0000ff">print<span style="color: #000000">(Person.nation)
      <span style="color: #008000">#<span style="color: #008000"> p1.nation = 'china'
      <span style="color: #0000ff">print<span style="color: #000000">(p1.nation)
      <span style="color: #0000ff">print<span style="color: #000000">(p2.nation)
      <span style="color: #008000">#<span style="color: #008000"> print(Person.nation)
      <span style="color: #000000">
      p1.age = 20
      <span style="color: #008000">#<span style="color: #008000"> p1.height = 180

      <span style="color: #008000">#<span style="color: #008000"> 特殊的类属性<span style="color: #008000">

      <span style="color: #008000"> 表示类名的字符串

      <span style="color: #0000ff">print(Person.<span style="color: #800080">name<span style="color: #000000">)

      <span style="color: #008000">#<span style="color: #008000"> 表示父类构成的元组
      <span style="color: #0000ff">print(Person.<span style="color: #800080">bases<span style="color: #000000">)

      <span style="color: #008000">#<span style="color: #008000"> 存储类的相关信息
      <span style="color: #0000ff">print(Person.<span style="color: #800080">dict<span style="color: #000000">)

      <span style="color: #008000">#<span style="color: #008000"> 限制可以使用的属性
      <span style="color: #0000ff">print(Person.<span style="color: #800080">slots)

      说明:

      • 定义时使用classmethod装饰器装饰的方法
      • 使用时通过类名调用
    • 作用:

      • 可以创建对象或者简洁的创建对象
      • 对外提供简单易用的接口
    • 示例1:创建对象

      ( @classmethod </span><span style="color: #0000ff"&gt;def</span><span style="color: #000000"&gt; test(cls): </span><span style="color: #0000ff"&gt;print</span><span style="color: #000000"&gt;(cls) </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: #000000"> @classmethod
      <span style="color: #0000ff">def<span style="color: #000000"> create(cls):
      p =<span style="color: #000000"> cls()
      p.age = 1
      <span style="color: #0000ff">return<span style="color: #000000"> p

      p1 =<span style="color: #000000"> Person()
      p1.eat()

      <span style="color: #008000">#<span style="color: #008000"> 通过类名调用
      <span style="color: #000000"> Person.test()
      <span style="color: #008000">#<span style="color: #008000"> 创建或简洁的创建对象
      p2 =<span style="color: #000000"> Person.create()
      <span style="color: #0000ff">print(type(p2))

      示例2:提供接口

      ==</span><span style="color: #0000ff"&gt;def</span><span style="color: #000000"&gt; add(self): </span><span style="color: #0000ff"&gt;return</span> self.num1 +<span style="color: #000000"&gt; self.num2 </span><span style="color: #0000ff"&gt;def</span><span style="color: #000000"&gt; sub(self): </span><span style="color: #0000ff"&gt;return</span> self.num1 -<span style="color: #000000"&gt; self.num2 </span><span style="color: #0000ff"&gt;def</span><span style="color: #000000"&gt; mul(self): </span><span style="color: #0000ff"&gt;return</span> self.num1 *<span style="color: #000000"&gt; self.num2 </span><span style="color: #0000ff"&gt;def</span><span style="color: #000000"&gt; div(self): </span><span style="color: #0000ff"&gt;if</span> self.num2 ==<span style="color: #000000"&gt; 0: </span><span style="color: #0000ff"&gt;return</span><span style="color: #000000"&gt; None </span><span style="color: #0000ff"&gt;return</span> self.num1 /<span style="color: #000000"&gt; self.num2 </span><span style="color: #008000"&gt;#</span><span style="color: #008000"&gt; 对外提供简单易用的接口</span>

      <span style="color: #000000"> @classmethod
      <span style="color: #0000ff">def<span style="color: #000000"> pingfanghe(cls,num2):
      n1 =<span style="color: #000000"> cls(num1,num1)
      n12 =<span style="color: #000000"> n1.mul()

          n2 </span>=<span style="color: #000000"&gt; cls(num2,num2)
          n22 </span>=<span style="color: #000000"&gt; n2.mul()
      
          n3 </span>=<span style="color: #000000"&gt; cls(n12,n22)
          </span><span style="color: #0000ff"&gt;return</span><span style="color: #000000"&gt; n3.add()

      he = Number.pingfanghe(3,4<span style="color: #000000">)
      <span style="color: #0000ff">print(he)

      说明:

      • 使用staticmethod装饰器装饰的方法(方法没有cls参数)
      • 通过类名进行调用
    • 示例:

      (</span><span style="color: #008000"&gt;#</span><span style="color: #008000"&gt; 创建对象</span>

      <span style="color: #000000"> @staticmethod
      <span style="color: #0000ff">def<span style="color: #000000"> create():
      p =<span style="color: #000000"> Person()
      <span style="color: #0000ff">return<span style="color: #000000"> p

      Person.test()
      p =<span style="color: #000000"> Person.create()
      <span style="color: #0000ff">print(p)

      总结:

      • 凡是静态方法完成的功能都可以是类方法完成
      • 若方法中没有使用到类名(cls),可以使用静态方法

      定义:不同的对象,调用相同的方法,有不同的响应,称为多态

    • 示例:

      <span style="color: #0000ff">class<span style="color: #000000"> Dog(Animal):
      <span style="color: #0000ff">def<span style="color: #000000"> run(self):
      <span style="color: #0000ff">print(<span style="color: #800000">'<span style="color: #800000">狗通常走S型<span style="color: #800000">'<span style="color: #000000">)

      <span style="color: #0000ff">class<span style="color: #000000"> Cat(Animal):
      <span style="color: #0000ff">def<span style="color: #000000"> run(self):
      <span style="color: #0000ff">print(<span style="color: #800000">'<span style="color: #800000">猫平时走猫步,偶尔突然加速<span style="color: #800000">'<span style="color: #000000">)

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

      d =<span style="color: #000000"> Dog()
      c =<span style="color: #000000"> Cat()
      test(d)
      test(c)

      说明:将成员方法当做属性一样进行访问

    • 作用:保护特定属性,或者对特定属性进行处理

    • 示例:

      = = </span><span style="color: #008000"&gt;#</span><span style="color: #008000"&gt; 该方法可以像成员属性一样访问</span>

      <span style="color: #000000"> @property
      <span style="color: #0000ff">def<span style="color: #000000"> password(self):
      <span style="color: #0000ff">print(<span style="color: #800000">'<span style="color: #800000">有人想查看密码<span style="color: #800000">'<span style="color: #000000">)
      <span style="color: #0000ff">return <span style="color: #800000">'<span style="color: #800000">想偷看密码,没门<span style="color: #800000">'
      <span style="color: #008000">#<span style="color: #008000"> return self.__password

        <span style="color: #008000"&gt;#</span><span style="color: #008000"&gt; 在设置密码时,会自动调用</span>

      <span style="color: #000000"> @password.setter
      <span style="color: #0000ff">def<span style="color: #000000"> password(self,password):
      <span style="color: #0000ff">print(<span style="color: #800000">'<span style="color: #800000">@password.setter<span style="color: #800000">'<span style="color: #000000">,password)
      self.<span style="color: #800080">__password = <span style="color: #800000">'<span style="color: #800000">加密<span style="color: #800000">' + password + <span style="color: #800000">'<span style="color: #800000">加密<span style="color: #800000">'<span style="color: #000000">

      u = User(<span style="color: #800000">'<span style="color: #800000">xiaoming<span style="color: #800000">',<span style="color: #800000">'<span style="color: #800000">222221<span style="color: #800000">'<span style="color: #000000">)
      <span style="color: #008000">#<span style="color: #008000"> print(u.password())
      <span style="color: #0000ff">print<span style="color: #000000">(u.password)

      <span style="color: #008000">#<span style="color: #008000"> 设置密码,会自动调用setter方法
      u.password = <span style="color: #800000">'<span style="color: #800000">abcde<span style="color: #800000">'

    (编辑:李大同)

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

      推荐文章
        热点阅读