python--面向对象之三个特性:封装、继承、多态
一、面向对象简介
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--面向对象之三个特性:封装、继承、多态的更多相关文章
- Python - 面向对象编程 - 三大特性之继承
继承 继承也是面向对象编程三大特性之一 继承是类与类的一种关系 定义一个新的 class 时,可以从某个现有的 class 继承 新的 class 类就叫子类(Subclass) 被继承的类一般称为父 ...
- Java三大特性(封装,继承,多态)
Java中有三大特性,分别是封装继承多态,其理念十分抽象,并且是层层深入式的. 一.封装 概念:封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将抽象得到的数据 ...
- 深入理解Java面向对象三大特性 封装 继承 多态
1.封装 封装的定义: 首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系 为什么需要封装: 封装符合面向对象设计原则的第一条:单一性原则,一个类 ...
- C++三大特性 封装 继承 多态
C++ 三大特性 封装,继承,多态 封装 定义:封装就是将抽象得到的数据和行为相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成类,其中数据和函数都是类的成员,目的在于将对 ...
- 1.Java基础-面向对象编程思想(封装继承多态接口)
封装: 1.定义:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别. 2.封装的目的是:增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,一特定的 ...
- Python面向对象的三大特性之继承和组合
继承和组合 一.组合 组合:组合指的是,在一个类中以另外一个类的对象(也就是实例)作为数据属性,称为类的组合 也就是说:一个类的属性是另一个类的对象,就是组合 例子: 圆环是由两个圆组成的,圆环的面积 ...
- java面向对象(封装-继承-多态)
框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...
- Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态)
Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态) 1.面向对象的三大特性: (1)继承 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可以 ...
- python面向对象(封装,继承,多态)
python面向对象(封装,继承,多态) 学习完本篇,你将会深入掌握 如何封装一个优雅的借口 python是如何实现继承 python的多态 封装 含义: 1.把对象的属性和方法结合成一个独立的单位, ...
- php面向对象 封装继承多态 接口、重载、抽象类、最终类总结
1.面向对象 封装继承多态 接口.重载.抽象类.最终类 面向对象 封装继承多态 首先,在解释面向对象之前先解释下什么是面向对象? [面向对象]1.什么是类? 具有相同属性(特征)和方法(行为)的一 ...
随机推荐
- 【LeetCode】缺失的第一个正数【原地HashMap】
给定一个未排序的整数数组,找出其中没有出现的最小的正整数. 示例 1: 输入: [1,2,0] 输出: 3 示例 2: 输入: [3,4,-1,1] 输出: 2 示例 3: 输入: [7,8,9,11 ...
- [转帖]IPC网络高清摄像机基础知识1(IPC芯片市场分析以及“搅局者”华为海思 “来自2013年”)
IPC网络高清摄像机基础知识1(IPC芯片市场分析以及“搅局者”华为海思 “来自2013年”) 2016-06-02 14:23:49 Times_poem 阅读数 9734更多 分类专栏: IPC网 ...
- Akka-CQRS(13)- SSL/TLS for gRPC and HTTPS:自签名证书产生和使用
到现在,我们已经完成了POS平台和前端的网络集成.不过,还是那句话:平台系统的网络安全是至关重要的.前一篇博客里我们尝试实现了gRPC ssl/tls网络连接,但测试时用的证书如何产生始终没有搞清楚. ...
- trie、FSA、FST(转)
add by zhj: 在学习Lucene的存储结构时,看到其使用了FST,这篇文章写的不错. trie,FSA,FST都是用来解决有限状态机的存储,trie是树,它进一步演化为FSA和FST,这两者 ...
- CRLF will be replaced by LF in XXX when git commit
转载自Git-warning: CRLF will be replaced by LF in XXX 今天,普通平凡的一天,平凡的使用 git add .,然后又出现一个之前没遇到的错误提示 . 真开 ...
- 修改dedecms 一些配置cfg_softname,cfg_soft_enname,cfg_soft_devteam
1.找到include 中的common.inc.php 直接修改就可以了.
- IIS 图片 JS CSS 500错误
1.检查站点MIME类型是否可以正常加载
- 18 java I/O 系统
流的类继承结构 我们首先看看流的类继承结构,有助于理解下个标签的内容 InputStream OutputStream Reader Writer File类 File类技能表示一个特定文件的名称,又 ...
- pandas-18 reindex用法
pandas-18 reindex用法 pandas中的reindex方法可以为series和dataframe添加或者删除索引. 方法:serise.reindex().dataframe.rein ...
- Java 字符串(二)字符串常用操作
一.连接字符串 1.连接多个字符串 使用“+”运算符可以实现连接多个字符串的功能.“+” 运算符可以连接多个运算符并产生一个 String 对象. 2.连接其他数据类型 字符串与其他基本数据类型进行连 ...