一、面向对象简介

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. 【LeetCode】缺失的第一个正数【原地HashMap】

    给定一个未排序的整数数组,找出其中没有出现的最小的正整数. 示例 1: 输入: [1,2,0] 输出: 3 示例 2: 输入: [3,4,-1,1] 输出: 2 示例 3: 输入: [7,8,9,11 ...

  2. [转帖]IPC网络高清摄像机基础知识1(IPC芯片市场分析以及“搅局者”华为海思 “来自2013年”)

    IPC网络高清摄像机基础知识1(IPC芯片市场分析以及“搅局者”华为海思 “来自2013年”) 2016-06-02 14:23:49 Times_poem 阅读数 9734更多 分类专栏: IPC网 ...

  3. Akka-CQRS(13)- SSL/TLS for gRPC and HTTPS:自签名证书产生和使用

    到现在,我们已经完成了POS平台和前端的网络集成.不过,还是那句话:平台系统的网络安全是至关重要的.前一篇博客里我们尝试实现了gRPC ssl/tls网络连接,但测试时用的证书如何产生始终没有搞清楚. ...

  4. trie、FSA、FST(转)

    add by zhj: 在学习Lucene的存储结构时,看到其使用了FST,这篇文章写的不错. trie,FSA,FST都是用来解决有限状态机的存储,trie是树,它进一步演化为FSA和FST,这两者 ...

  5. CRLF will be replaced by LF in XXX when git commit

    转载自Git-warning: CRLF will be replaced by LF in XXX 今天,普通平凡的一天,平凡的使用 git add .,然后又出现一个之前没遇到的错误提示 . 真开 ...

  6. 修改dedecms 一些配置cfg_softname,cfg_soft_enname,cfg_soft_devteam

    1.找到include 中的common.inc.php 直接修改就可以了.

  7. IIS 图片 JS CSS 500错误

    1.检查站点MIME类型是否可以正常加载

  8. 18 java I/O 系统

    流的类继承结构 我们首先看看流的类继承结构,有助于理解下个标签的内容 InputStream OutputStream Reader Writer File类 File类技能表示一个特定文件的名称,又 ...

  9. pandas-18 reindex用法

    pandas-18 reindex用法 pandas中的reindex方法可以为series和dataframe添加或者删除索引. 方法:serise.reindex().dataframe.rein ...

  10. Java 字符串(二)字符串常用操作

    一.连接字符串 1.连接多个字符串 使用“+”运算符可以实现连接多个字符串的功能.“+” 运算符可以连接多个运算符并产生一个 String 对象. 2.连接其他数据类型 字符串与其他基本数据类型进行连 ...