一、面向对象简介

1、面向对象不是所有的情况都适用
2、面向对象编程
  a.定义类
    class 类名:
      def 方法1(self, 参数名):
        方法体

  b.根据类创建对象,使用对象去执行类中的方法
    obj = 类名()
    obj.方法名
3、self,形参,python内部传递

4、函数式编程与面向对象式编程的区别


示例:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
面向对象编程初识
"""
#先定义一个类
class Hello():
#定义一个方法
  def sayHell(self, name):
  print('欢迎您!' + name)
#创建一个对象
obj = Hello()
obj.sayHell('yusheng_liang')

二、面向对象--封装
应用场景:
  1、当同一类型的方法具有相同参数时,直接封装到对象即可
  2、把类当做模板,创建多个对象(对象内封装的数据可以不一样)

  3、类名+括号
    自动执行类中的__init__方法:创建了一个对象
    在__init__方法中执行具体封装的操作
    __init__有一个特殊名字:构造方法(初始化)

示例一:面向对象之封装,非主流的方式

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
封装,非主流的方式
"""
class Foo():
  def add_foo(self):
  print(self.name) #打印已经封装好的对象属性
def del_foo(self):
  print(self.name) #创建一个对象
obj1 = Foo()
#在对象中封装数据
obj1.name = 'yusheng_liang'
#执行方法,执行过程中可以根据self去obj1中取已经封装在里面的数据
obj1.add_foo()

示例二:面向对象之封装,使用构造方法的方式封装数据

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
封装,使用构造方法的方式封装数据
"""
class Foo():
def __init__(self, args):
  """
  构造方法
  :param args:
  """
  self.name = args def add_foo(self):
  print(self.name) #打印已经封装好的对象属性
def del_foo(self):
  print(self.name) #创建一个对象,实例,并且将yusheng_liang封装到对象中
obj1 = Foo('yusheng_liang') # #在对象中封装数据
# obj1.name = 'yusheng_liang' #执行方法,执行过程中可以根据self去obj1中取已经封装在里面的数据
obj1.add_foo()

三、面向对象--继承

  1、派生类可以继承基类中所有的功能
  2、派生类和基类同时存在相同的功能时,优先找派生类的
  3、python类可以同时继承多个类(C#/java不可以),用逗号隔开,优先找自己的功能,再在继承类中从左到右的顺序查找功能

  4、多继承时的查找顺序如下:

示例:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
面向对象之继承
"""
#定义一个父类,又叫基类
class Animals:
  def say(self):
  print('Hello, I am saying')
def run(self):
  print('I am running') #定义子类,又叫派生类,在括号中写上父类名
class Cat(Animals):
  def __init__(self, name):
    self.name = name   def sing(self):
    print(self.name + ' 喵喵喵') #定义子类,又叫派生类,在括号中写上父类名
class Dog(Animals):
  def __init__(self, name):
    self.name = name   def sing(self):
    print(self.name + ' 汪汪汪') cat1= Cat('小猫咪')
cat1.sing()
cat1.say() dog1 = Dog('小狗狗')
dog1.sing()
dog1.run()

示例结果:

四、面向对象--多态,多种形态
  python本身支持多态

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
多态
""" class Foo:
  def f1(self):
    print('Foo') class Bar:
  def f1(self):
    print('Bar')   def func(arg):
    print(arg) func(Foo())
func(Bar())

补充:
  查找源码的过程(self.xxxx(), 从底层开始找)
  执行父类的构造方式:
    super(当前类, self).init()
    父类.__init__(self,xxx)

五、面向对象的进阶

5.1、利用反射查看面向对象成员归属

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
利用反射查看面向对象成员归属
""" class Foo:   def __init__(self, name):
    self.name = name   def show(self):
    print('show') # 反射:以字符串的形式去对象(模块)中操作其成员
# 当反射对象为一个类时,只能找类里的成员
obj = hasattr(Foo, 'show1')
print(obj) #当反射的对象为一个对象时,即可以找对象,找类的成员
obj1 = Foo('yusheng_liang')
ret = hasattr(obj1, 'name')
print(ret)
ret1 = hasattr(obj1, 'show')
print(ret1)

5.2、面向对象类成员之静态字段,静态方法,类方法

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
面向对象类成员之静态字段,静态方法,类方法
"""
class Provice:
  #静态字段
  country = "中国"
  def __init__(self, name):
  #普通字段,对象中
    self.name = name   #普通方法,类中
  def show(self):
    print('show')   #静态方法,没有self
  @staticmethod
  def static_obj(arg1, arg2):
    print('我是一个静态方法,可以传递任何参数')   #类方法
  @classmethod
  def class_obj(cls):
    print('我是一个类方法:', cls)   #特性,将方法伪造成一种字段
  @property
  def end(self):
    tmp = "%s 大大的好" %self.name
    print(tmp)   #特性的设置值
  @end.setter
  def end(self,value):
    self.name = value # 1、通过类访问的有:静态字段、静态方法,类方法
print('------1、通过类访问的有:静态字段(每个对象都有一份)、静态方法(无需使用对象封装的内容),类方法------')
print(Provice.country) #静态字段
Provice.static_obj(1, 2) #静态方法
Provice.class_obj() #类方法 print("-------2、通过对象访问的有:普通字段(每个对象都不同的数据),类的方法(普通方法,使用对象中的数据)-----------")
# 2、通过对象访问的有:普通字段,类的方法
obj = Provice("广东")
ret = obj.show()

# 3、特性的访问

print('-------3、特性的访问----------')

obj1 = Provice("China")
ret1 = obj1.end

#设置end的参数值
obj1.end="我被重新设置了值"
print(obj1.end)

实例结果:

5.3、面向对象之成员修饰符

成员修饰符:公有和私有
私有的,自己好使,其他的谁都不好使

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
面向对象之成员修饰符
静态字段,普通字段,静态方法,普通方法,类方法,
""" class Foo:
  xo = "xo"
  __ox = "我是ox"   def __init__(self, bk):
    self.backend = bk   def fetch(self):
    print(Foo.__ox) #静态方法的修饰符调用 obj = Foo('')
obj.fetch()

六、面向对象的特殊成员

6.1、特殊成员--call
实现了__call__方法的对象,相当于重载了(),可以实现调用功能。

 class A():
def __call__(self,name):
print("%s is running!" % name) a = A()
a("people")

结果:
people is running!

6.2、特殊成员之setitem
设置给定键的值

6.3、特殊成员之getitem
返回键对应的值。

6.4、特殊成员之delitem
删除给定键对应的元素。

6.5、特殊成员之iter

 class Foo:

     def __iter__(self):
yield 1
yield 2
yield 3 obj = Foo()
#如果执行for对象时,自动会执行对象的iter方法,生成器
for i in obj:
print(i)

总结:方法的原理就是:当我们对类的属性item进行下标的操作时,首先会被__getitem__()、__setitem__()、__delitem__()拦截,从而进行我们在方法中设定的操作,如赋值,修改内容,删除内容等等。

python--面向对象之三个特性:封装、继承、多态的更多相关文章

  1. Python - 面向对象编程 - 三大特性之继承

    继承 继承也是面向对象编程三大特性之一 继承是类与类的一种关系 定义一个新的 class 时,可以从某个现有的 class 继承 新的 class 类就叫子类(Subclass) 被继承的类一般称为父 ...

  2. Java三大特性(封装,继承,多态)

    Java中有三大特性,分别是封装继承多态,其理念十分抽象,并且是层层深入式的. 一.封装 概念:封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将抽象得到的数据 ...

  3. 深入理解Java面向对象三大特性 封装 继承 多态

    1.封装 封装的定义: 首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系 为什么需要封装: 封装符合面向对象设计原则的第一条:单一性原则,一个类 ...

  4. C++三大特性 封装 继承 多态

    C++ 三大特性 封装,继承,多态 封装 定义:封装就是将抽象得到的数据和行为相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成类,其中数据和函数都是类的成员,目的在于将对 ...

  5. 1.Java基础-面向对象编程思想(封装继承多态接口)

    封装: 1.定义:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别. 2.封装的目的是:增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,一特定的 ...

  6. Python面向对象的三大特性之继承和组合

    继承和组合 一.组合 组合:组合指的是,在一个类中以另外一个类的对象(也就是实例)作为数据属性,称为类的组合 也就是说:一个类的属性是另一个类的对象,就是组合 例子: 圆环是由两个圆组成的,圆环的面积 ...

  7. java面向对象(封装-继承-多态)

    框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...

  8. Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态)

    Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态) 1.面向对象的三大特性: (1)继承 ​ 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可以 ...

  9. python面向对象(封装,继承,多态)

    python面向对象(封装,继承,多态) 学习完本篇,你将会深入掌握 如何封装一个优雅的借口 python是如何实现继承 python的多态 封装 含义: 1.把对象的属性和方法结合成一个独立的单位, ...

  10. php面向对象 封装继承多态 接口、重载、抽象类、最终类总结

    1.面向对象 封装继承多态  接口.重载.抽象类.最终类 面向对象 封装继承多态  首先,在解释面向对象之前先解释下什么是面向对象? [面向对象]1.什么是类? 具有相同属性(特征)和方法(行为)的一 ...

随机推荐

  1. pip install 时报错 pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.

    pip install 时报错: pip is configured with locations that require TLS/SSL, however the ssl module in Py ...

  2. HUT 排序训练赛 G - Clock

    Clock Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u [Submit]   [Go ...

  3. 最新修改Oracle10gscott用户

    1.以system登录及输入自己设置口令; 2.更换sysdba身份: conn system/orcl as sysdba; 3.解锁scott用户(因装好默认是锁定的): alter user s ...

  4. 7. Scala面向对象编程(中级部分)

    7.1 包 7.1.1 看一个应用场景 现在有两个程序员共同开发一个项目,程序员xiaoming希望定义一个类取名Dog,程序员xiaohong也想定一个类也叫Dog,两个程序员还为此吵了起来,该怎么 ...

  5. Java开发月薪2W的知乎讨论记录截取

    1. 推荐看 作者:匿名用户 链接:https://www.zhihu.com/question/39890405/answer/83676977 来源:知乎 著作权归作者所有.商业转载请联系作者获得 ...

  6. K8S学习笔记之Kubernetes 配置管理 ConfigMap

    0x00 概述 很多情况下我们为某一应用做好镜像,当我们想修改其中的一些参数的时候,就变得比较麻烦,又要重新制作镜像,我们是不是有一种方式,让镜像根据不同的场景调用我们不同的配置文件呢,那我们就需要用 ...

  7. spring接口文档注解:@ApiOperation

    @ApiOperation不是spring自带的注解是swagger里的 com.wordnik.swagger.annotations.ApiOperation; @ApiOperation和@Ap ...

  8. Vue自定义组件中Props中接收数组或对象

    原文:https://www.jianshu.com/p/904551dc6c15 自定义弹框组件时,需要在弹框内展示商品list,所以需要组件中的对应字段接收一个Array数组,默认返回空数组[], ...

  9. 好用的随查工具Dash

    1. 好用的随查工具Dash 1.1. mac版本推荐 推荐一个很好用的工具,名字就叫Dash,当然缺点就是只有英文版,中文版可能也有但更新肯定不如英文及时 可以自由下载各种文档,比如下面的这图,左侧 ...

  10. 2. vue基础-vue-cli(vue脚手架)

    1. 作用 ​ 快速创建一个基于webpack模板的项目 2. 安装工具 安装webpack:使用npm全局安装webpack,打开命令行工具,输入 npm install webpack -g,安装 ...