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. 将Hexo博客部署到云主机

    摘要: 在云主机上搭建一个git裸仓库,然后使用nginx作为网页服务器,就可以轻松将Hexo博客通过git部署到云主机上. 这是一个忧伤的故事 我的博客KiwenLau之前部署在Coding Pag ...

  2. WORLD F4快捷重复上一步操作

    只需做一次动作,后面就直接按F4即可重复上一次操作.

  3. CSS笔记1:属性--定位

    相对定位是“相对于”元素在文档中的初始位置,而绝对定位是“相对于”最近的已定位祖先元素,如果不存在已定位的祖先元素,那么“相对于”最初的包含块. 元素定位 属性 版本 继承 描述 position c ...

  4. Android为TV端助力 Intent匹配action,category和data原则

    1.当你在androidmanifest里面定义了一个或多个action时 你使用隐式意图其他activity或者service时,规定你隐式里面的action必须匹配XML中定义的action,可以 ...

  5. python特性--property

    在定义一个类的时候,有时我们需要获取一个类的属性值,而这个属性值需要经过类中的其他属性运算来获得的.那么很容易,只要我们在类中定义一个方法,并且通过调用方法可以获取到那个需要运算的属性值.那么,问题来 ...

  6. SQL SERVER中LIKE使用变量类型不同输出结果不一致解惑

    一同事在写脚本时,遇到一个关于LIKE里面使用不同的变量类型导致查询结果不一致的问题,因为这个问题被不同的人问过好几次,索性总结一下,免得每次都要解释一遍,直接丢一篇博客岂不是更方便!其实看似有点让人 ...

  7. mssql 怎么配置指定的表 不允许删除数据?

    http://www.maomao365.com/?p=5089 <span style="color:red;font-weight:bold;">前言: 前几天收到 ...

  8. MySQL各类SQL语句的加锁机制

    官网参考:https://dev.mysql.com/doc/refman/5.6/en/innodb-locks-set.html MySQL把读操作分为两大类:锁定读和非锁定读(即locking ...

  9. c/c++线性队列

    线性队列 队列是先进先出,和栈相反. 不循环的队列就是浪费空间,如果tail到了最大值后,即使前面出队了,有空的位置,也不能再入队. seqqueue.h #ifndef __SEQQUEUE__ # ...

  10. windows下数据库文件使用脚本同步到linux下的mysql数据库中

    1.背景 windows server 2008 下 每天会有 *.sql数据文件 需要上传到linux 中的mysql数据库中 而运维人员是在 windows server 下使用 xshell 连 ...