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

前端之家收集整理的这篇文章主要介绍了Python基础—12-面向对象(02)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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

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

      父类时,默认继承object =</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; <a href="/tag/fulei/" target="_blank" class="keywords">父类</a>的<a href="/tag/fangfa/" target="_blank" class="keywords">方法</a>部分合适,需要<a href="/tag/tianjia/" target="_blank" class="keywords">添加</a><a href="/tag/neirong/" target="_blank" class="keywords">内容</a>进行完善</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; 保留<a href="/tag/fulei/" target="_blank" class="keywords">父类</a>的<a href="/tag/neirong/" target="_blank" class="keywords">内容</a>,不建议使用此方式</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._Persontest()
      <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()

    属性" data-source-line="162">类属性

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

    • 示例:

      属性,通过类名访问,属于整个类,而不是某个对象
        <span style="color: #008000"&gt;#</span><span style="color: #008000"&gt; 限制可以使用的<a href="/tag/shuxing/" target="_blank" class="keywords">属性</a>,提高访问的效率</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)

    方法" data-source-line="208">类方法

      说明:

      • 定义时使用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;类<a href="/tag/fangfa/" target="_blank" class="keywords">方法</a></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)

    方法" data-source-line="289">静态方法

      说明:

      • 使用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)

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

    • 示例:

      <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)

    属性函数" data-source-line="350">属性函数

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

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

    • 示例:

      = = </span><span style="color: #008000"&gt;#</span><span style="color: #008000"&gt; 该<a href="/tag/fangfa/" target="_blank" class="keywords">方法</a>可以像成员<a href="/tag/shuxing/" target="_blank" class="keywords">属性</a>一样访问</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; 在设置密码时,会<a href="/tag/zidong/" target="_blank" class="keywords">自动</a><a href="/tag/diaoyong/" target="_blank" class="keywords">调用</a></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">111111<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">'

    猜你在找的Python相关文章