zoukankan      html  css  js  c++  java
  • 面向对象的三大特性

    继承

    继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类

    python中类的继承分为:单继承和多继承

     1 class ParentClass1: #定义父类
     2     pass
     3 
     4 class ParentClass2: #定义父类
     5     pass
     6 
     7 class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass
     8     pass
     9 
    10 class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类
    11     pass

    查看继承

    1 >>> SubClass1.__bases__ #__base__只查看从左到右继承的第一个子类,__bases__则是查看所有继承的父类
    2 (<class '__main__.ParentClass1'>,)
    3 >>> SubClass2.__bases__
    4 (<class '__main__.ParentClass1'>, <class '__main__.ParentClass2'>)

    提示:如果没有指定基类,python的类会默认继承object类,object是所有python类的基类,它提供了一些常见方法(如__str__)的实现。

    1 >>> ParentClass1.__bases__
    2 (<class 'object'>,)
    3 >>> ParentClass2.__bases__
    4 (<class 'object'>,)

    接口

     1 from abc import abstractmethod,ABCMeta
     2 class Pay(metaclass=ABCMeta):
     3     @abstractmethod
     4     def pay(self,money):pass
     5 
     6 class Wechat(Pay):
     7     def pay(self,money):
     8         print('用微信支付了%s元'%money)
     9 
    10 class Alipay(Pay):
    11     def pay(self,money):
    12         print('用支付宝支付了%s元'%money)
    13 
    14 def pay(obj,money):
    15     obj.pay(money)
    16 
    17 w = Wechat()
    18 a = Alipay()
    19 pay(w,100)
    20 pay(a,200)

    多态

    多态指的是一类事物有多种形态

    动物有多种形态:人,狗,猪

     1 import abc
     2 class Animal(metaclass=abc.ABCMeta): #同一类事物:动物
     3     @abc.abstractmethod
     4     def talk(self):
     5         pass
     6 
     7 class People(Animal): #动物的形态之一:人
     8     def talk(self):
     9         print('say hello')
    10 
    11 class Dog(Animal): #动物的形态之二:狗
    12     def talk(self):
    13         print('say wangwang')
    14 
    15 class Pig(Animal): #动物的形态之三:猪
    16     def talk(self):
    17         print('say aoao')

    多态性

     1 peo=People()
     2 dog=Dog()
     3 pig=Pig()
     4 
     5 #peo、dog、pig都是动物,只要是动物肯定有talk方法
     6 #于是我们可以不用考虑它们三者的具体是什么类型,而直接使用
     7 peo.talk()
     8 dog.talk()
     9 pig.talk()
    10 
    11 #更进一步,我们可以定义一个统一的接口来使用
    12 def func(obj):
    13     obj.talk()

    鸭子类型

    Python崇尚鸭子类型,即‘如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子’

    python程序员通常根据这种行为来编写程序。例如,如果想编写现有对象的自定义版本,可以继承该对象

    也可以创建一个外观和行为像,但与它无任何关系的全新对象,后者通常用于保存程序组件的松耦合度。

    例1:利用标准库中定义的各种‘与文件类似’的对象,尽管这些对象的工作方式像文件,但他们没有继承内置文件对象的方法

    例2:序列类型有多种形态:字符串,列表,元组,但他们直接没有直接的继承关系

    封装

    【封装】

             隐藏对象的属性和实现细节,仅对外提供公共访问方式。

    【好处】 

    1. 将变化隔离; 

    2. 便于使用;

    3. 提高复用性; 

    4. 提高安全性;

    【封装原则】

          1. 将不需要对外提供的内容都隐藏起来;

          2. 把属性都隐藏,提供公共方法对其访问。

     1 #其实这仅仅这是一种变形操作
     2 #类中所有双下划线开头的名称如__x都会自动变形成:_类名__x的形式:
     3 
     4 class A:
     5     __N=0 #类的数据属性就应该是共享的,但是语法上是可以把类的数据属性设置成私有的如__N,会变形为_A__N
     6     def __init__(self):
     7         self.__X=10 #变形为self._A__X
     8     def __foo(self): #变形为_A__foo
     9         print('from A')
    10     def bar(self):
    11         self.__foo() #只有在类内部才可以通过__foo的形式访问到.
    12 
    13 #A._A__N是可以访问到的,即这种操作并不是严格意义上的限制外部访问,仅仅只是一种语法意义上的变形

    这种自动变形的特点:

    1.类中定义的__x只能在内部使用,如self.__x,引用的就是变形的结果

    2.这种变形其实正是针对外部的变形,在外部是无法通过__x这个名字访问到的。

    3.在子类定义的__x不会覆盖在父类定义的__x,因为子类中变形成了:_子类名__x,而父类中变形成了:_父类名__x,即双下滑线开头的属性在继承给子类时,子类是无法覆盖的。

    这种变形需要注意的问题是:

    1.这种机制也并没有真正意义上限制我们从外部直接访问属性,知道了类名和属性名就可以拼出名字:_类名__属性,然后就可以访问了,如a._A__N

    2.变形的过程只在类的内部生效,在定义后的赋值操作,不会变形

    3.在继承中,父类如果不想让子类覆盖自己的方法,可以将方法定义为私有的

     1 class Person:
     2     def __init__(self,name,password):
     3         self.name = name
     4         self.__password = password  #定义一个私有属性
     5 
     6     def __getPassword(self):        #定义一个私有方法
     7         return self.__password
     8 
     9     def login(self):
    10         return self.__getPassword()
    11 
    12 p1 = Person('fuyong',123)
    13 print(p1.__dict__)          #{'name': 'fuyong', '_Person__password': 123}
    14 print(p1._Person__password) #123
    15 print(p1.login())     #123
  • 相关阅读:
    http请求类型简介
    关于PLSQL连接报错:ORA-12154:TNS:无法解析指定的连接标识符
    JDK8的安装与配置
    今天新装tomcat遇到黑窗口(startup.bat)启动乱码问题解决!!!
    一个简单的工厂模式(一个接口,多个实现,通过调用条件的不同,分别去调用符合的实现)
    数组(复习)
    java选择结构、循环结构(复习)
    java常用的数据类型,变量和常量,运算符(复习)
    java输入输出,书写规范,运行原理,跨平台原理(复习)
    JAVA基础入门(JDK、eclipse下载安装)
  • 原文地址:https://www.cnblogs.com/fu-yong/p/8310544.html
Copyright © 2011-2022 走看看