Python有两种编程方式:函数式+面向对象

函数式编程可以做所有的事情,但是否合适?

面向对象:

一、定义

  函数:

    def + 函数名(参数)

  面象对象:

    class  bar--->  名字叫bar的类

       def  --->类中的函数叫方法

二、执行

  函数:

    函数名(参数)

  面向对象:

    obj = Bar()  #创建中间人(对象、实例)

    obj.foo

定义类并执行类中的方法:

class 类名:  #类名后面没有括号

  def 方法名(self,args)

    print(args)

中间人 = 类名( )

中间人.方法名(1111)

class bar:    #类名后面没有括号
def foo(self,args):
print(args) obj = bar() #定义对象的时候需要加括号
obj.foo('this is the test')

类里面的方法也有return值

类对象指针

self

self代指,调用方法的对象(中间人)

构造方法:

特殊作用:

  在执行obj = 类名()时,一共做了两件事:

    1、创建对象

    2、通过对象执行类中的一个特殊方法(构造方法)

面象对象的三大特性之一:封装

利用构造方法将值封装到对象中去。

class person:
def __init__(self,name,age):
"""
构造方法,构造方法的特性,类名()自动执行构造方法
:param name:
:param age:
"""
self.n = name
self.a = age
def show(self):
print('%s-%s'%(self.n,self.a)) #格式化字符,%s一定是要放在字符串中 lihuan = person('李欢',18)
lihuan.show()

面向对象编程适用场景:

  如果多个函数中有一些相同参数时,转换成面向对象

面象对象三大特性之二:继承

class F:    #父类,基类
def f1(self):
print("F.f1")
def f2(self):
print("F.f2") class S(F): #子类,派生类,定义子类的时候后面要加括号,括号中写上父类名称
def s1(self):
print("S.s1") s = S()
s.s1() #方法后面有括号,s1中的self是形参,此时代指s
s.f1()  #self用于指调用方法的调用者
#如果不想继承父类中的方法怎么办?(自己定义一个一样的方法,也叫重写)
class F: #父类,基类
def f1(self):
print("F.f1")
def f2(self):
print("F.f2") class S(F): #子类,派生类
def s1(self):
print("S.s1")
def f2(self):
print("S.f2") obj = S()
obj.s1()
obj.f2() #此时调用的就是S中的f2方法,父类的同名方法不执行
#如果既想调用自己的f2,又想调用的父类的f2,怎么办?
class F: #父类,基类
def f1(self):
print("F.f1")
def f2(self):
print("F.f2") class S(F): #子类,派生类
def s1(self):
print("S.s1")
def f2(self):
super(S, self).f2() #执行父类中f2方法的第一种方式,括号内为固定格式,这里不仅仅可以用此方式调用f2,也可以调用f1
F.f2(self) #执行父类中f2方法的第二种方式,括号里的self一定要加,建议用第一种
print("S.f2") obj = S()
obj.f2() #如果想执行自己和执行父类的顺序改变一下,定义方法的时候改变一下顺序就OK了

在Python中支持多继承,查找顺序如下:

1、左侧优先

2、一条道走到黑

3、如果有同一个根时,根最后才执行

class RequestHandler():
def serve_forever(self):
print('RequestHandler.serve_forever')
self.process_request() #执行这个的时候,还是从原点开始找
def process_request(self):
print('RequestHandler.process_request') class Minx():
def process_request(self):
print('Minx.process_request') class son(Minx,RequestHandler):
pass obj = son()
obj.serve_forever()

由于实例化的时候会自动执行__init__方法,所以如果实例化的类中没有__init__方法,它也会按照上面的方法去寻找,这一点一定要注意,因为这是自动执行的,所以很容易被忽略。

面向对象三大特性之三:多态

------------------->>>>Python原生就是多态的。

类成员:

  -字段

  -方法

  -属性

字段:

  普通字段,保存在对象中,只能通过对象访问

  静态字段,保存在类中,可以通过对象访问,也可以通过类访问

class province:
#静态字段,属于类,可以通过类访问,也可以通过对象访问
country = '中国'
def __init__(self,name):
#普通字段,属于对象,只能通过对象访问
self.name = name print(province.country) #中国
hebei = province('河北')
print(hebei.name) #河北
print(hebei.country) #中国,静态字段是可以通过对象访问的

方法:

  普通方法,保存在类中,由对象来调用,self是对象

  静态方法,保存在类中,由类直接调用,不用self参数

  类方法,保存在类中,由类直接调用,cls是当前类

class Foo:
def bar(self):
print('bar') @staticmethod #静态方法加的装饰器
def sta(a1,a2): #静态方法中括号内不用加self,可以没有参数,也可以设定其它参数,这样的话,类在调用方法的时候,就不用传参数了,这样就不用创建对象,就可以直接调用方法
print(a1,a2) @classmethod #类方法
def classmd(cls): #这个cls和self一样,python都会自动传
print('classmd') obj = Foo()
Foo.bar(obj) #这是类调用方法的,需要加参数self,所以必须要创建对象才行 Foo.sta(1,2) Foo.classmd()

####### 应用场景:

  如果对象中需要保存一些值,执行某功能时,需要使用对象中的值----->普通方法

  不需要任何对象中的值,静态方法

class Foo:
@property #创建属性(特性)
def per(self):
print('') obj.per #虽然是方法,但执行的后面却不加括号
class Foo:

    @property
def per(self):
return 1 @per.setter
def per(self,val): # 这块的函数名必须和上面装装饰器的名称一致,不然报错。Names of function and decorator don't match
print(val) @per.deleter
def per(self):
print(666) @per.getter
def per(self,val):
print(val) obj = Foo()
res = obj.per
print(res) # obj.per = 100 # del obj.per #

Python:Day24 类、类的三大特性的更多相关文章

  1. Python 基础 面向对象之二 三大特性

    Python 基础 面向对象之二 三大特性 上一篇主要介绍了Python中,面向对象的类和对象的定义及实例的简单应用,本篇继续接着上篇来谈,在这一篇中我们重点要谈及的内容有:Python 类的成员.成 ...

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

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

  3. 百万年薪python之路 -- 面向对象之三大特性

    1.面向对象之三大特性 1.1封装 封装:就是把一堆代码和数据,放在一个空间,并且可以使用 对于面向对象的封装来说,其实就是使用构造方法将内容封装到 对象 中,然后通过对象直接或者self间接获取被封 ...

  4. python学习之对象的三大特性

    在面向对象程序设计中,对象可以看做是数据(特性)以及由一系列可以存取.操作这些数据的方法所组成的集合.编写代码时,我们可以将所有功能都写在一个文件里,这样也是可行的,但是这样不利于代码的维护,你总不希 ...

  5. day24——面向对象三大特性、鸭子类型、类的约束、super的深度解析

    day24 面向对象的三大特性 继承.封装.多态 封装:把一堆东西(代码,数据)放到一个地方(空间),并且可以使用 class Student: def __init__(self, name, se ...

  6. Python 面向对象(创建类和对象,面向对象的三大特性是指:封装、继承和多态,多态性)

    概念:                                                                                                 ...

  7. python基础学习Day17 面向对象的三大特性之继承、类与对象名称空间小试

    一.课前回顾 类:具有相同属性和方法的一类事物 实例化:类名() 过程: 开辟了一块内存空间 执行init方法 封装属性 自动的把self返回给实例化对象的地方 对象:实例 一个实实在在存在的实体 组 ...

  8. python面向对象(类和对象及三大特性)

    类和对象是什么 创建类 新式类 和 经典类 面向对象三大特性 继承 封装 多态   面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...

  9. Python面向对象之:三大特性:继承,封装,多态以及类的约束

    前言: python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情 ...

随机推荐

  1. 7个拒绝使用TypeScript的借口

    译者按: TypeScript 学习成本不高,项目切换成本不低,不过还是值得试一试的! 原文:7 bad excuses for not using TypeScript 译者: Fundebug 为 ...

  2. idea代码快捷

    idea代码快捷:main函数快捷:psvmfor循环快捷:fori.foreach系统输出快捷:sout.serr 更多的提示可以按Ctrl+ J 进行查看 更改快捷:File-->Setti ...

  3. vue2.4+vue-cli+webpack history模式打包后 刷新404

    开启HTML5 History Mode后,尤其需要server端的支持,官方文档里就有介绍:(传送门: https://router.vuejs.org/zh-cn/essentials/histo ...

  4. react-conponent-secondesElapsed

    <!DOCTYPE html> <html> <head> <script src="../../build/react.js">& ...

  5. 基于Log4j完成定时创建和删除日志的方法

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 Log4j作为常用的日志生成工具,其清除日志的策略却十分有限. ...

  6. Android--使用JobService实现进程保活

    进程保活一直是广大APP开发者所希望的,因为进程活着我们就可以操作很多事情(推送,数据同步等等),但是google大大是不允许这样做的(优化),所以我们要另辟蹊径. 先来看看android中有几种进程 ...

  7. 性能测试 查看Android APP 帧数FPS的方法

    (下述需要先安装eclipse,不然无法抓包) 1.保证手机与PC连接是正常的 2.打开手机“设置”→“开发者选项”(没有开发者选项就点击“关于手机”“版本号”连续点击就会出现开发者选项了).找到监控 ...

  8. (其他)window10分盘

    由于thinkpad的一个c盘大概是一个t左右,所以我们先分一下盘.   首先找到计算机管理,然后找磁盘管理,右击比较大的磁盘,压缩卷,大概就压缩一半吧,然后新建简单卷,一直下一步,紧接着就完成了. ...

  9. css 布局之定位 相对/绝对/成比例缩放

    给body添加 overflow: hidden; 可以将页面所有的 滚动条隐藏,但必须要给body 设置一个高度 overflow: hidden; height:864px; 父元素必须要设置 p ...

  10. 虚拟机中安装Virtualbox,嵌套的虚拟机不能运行64位系统

    https://www.quora.com/Can-I-install-Virtualbox-in-a-virtual-machine Here is a previous question on Q ...