一、面向对象简介

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. TF-IDF算法简析

    TF-IDF算法可用来提取文档的关键词,关键词在文本聚类.文本分类.文献检索.自动文摘等方面有着重要应用. 算法原理 TF:Term Frequency,词频 IDF:Inverse Document ...

  2. Prometheus 配置采集目标

    Prometheus 配置采集目标 1.根据配置的任务(job)以http/s周期性的收刮(scrape/pull)2.指定目标(target)上的指标(metric).目标(target)3.可以以 ...

  3. Entity Framework 学习系列(1) - 认识理解Entity Framework

    目录 写在前面 什么是Entity Framework EF的优缺点 1.优点 2.缺点 如何理解ORM EF执行的原理 写在前面 在使用.net mvc 开发的时候.为了高效的开发,我们常常会搭配O ...

  4. Java自学-接口与继承 UML图

    UML 图 步骤 1 : UML 图 -- 类之间的关系 UML-Unified Module Language 统一建模语言,可以很方便的用于描述类的属性,方法,以及类和类之间的关系 步骤 2 : ...

  5. "startIWDP": true

    { "platformName": "iOS", "platformVersion": "11.0", "au ...

  6. Java语言的介绍

    1. 计算机语言 语言:沟通交流的方式 计算机语言:人与计算机之间的交流方式 java是一门计算机编程语言,也是意大利自行车品牌 软件工程师,java开发工程师 <--------------- ...

  7. 记一次针对Centos的入侵分析

    离开厂家多年,很久没有碰这类事件了. 回顾: 2017年9月末,接到一个朋友转述的求助信息.他一客户的服务器被黑了.服务器上所跑业务上的金额也全部被人转走了. 朋友的客户加我后,没头没尾的问我能不能做 ...

  8. AI涉及到数学的一些面试题汇总

    [LeetCode] Maximum Product Subarray的4种解法 leetcode每日解题思路 221 Maximal Square LeetCode:Subsets I II (2) ...

  9. android中实现service动态更新UI界面

    案例:通过service向远程服务器发送请求,根据服务器返回的结果动态更新主程序UI界面,主程序可实时关闭或重启服务. 注册BroadcastReceiver 在主程序activity中注册一个Bro ...

  10. Servlet HttpServletResponse对象、HttpServletRequest对象

    HttpServletResponse对象(response)的常用方法 setCharacterEncoding("utf-8")    //设置响应的编码字符集 setCont ...