Python:Day24 类、类的三大特性
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 类、类的三大特性的更多相关文章
- Python 基础 面向对象之二 三大特性
Python 基础 面向对象之二 三大特性 上一篇主要介绍了Python中,面向对象的类和对象的定义及实例的简单应用,本篇继续接着上篇来谈,在这一篇中我们重点要谈及的内容有:Python 类的成员.成 ...
- Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态)
Python 入门 之 面向对象的三大特性(封装 / 继承 / 多态) 1.面向对象的三大特性: (1)继承 继承是一种创建新类的方式,在Python中,新建的类可以继承一个或多个父类,父类又可以 ...
- 百万年薪python之路 -- 面向对象之三大特性
1.面向对象之三大特性 1.1封装 封装:就是把一堆代码和数据,放在一个空间,并且可以使用 对于面向对象的封装来说,其实就是使用构造方法将内容封装到 对象 中,然后通过对象直接或者self间接获取被封 ...
- python学习之对象的三大特性
在面向对象程序设计中,对象可以看做是数据(特性)以及由一系列可以存取.操作这些数据的方法所组成的集合.编写代码时,我们可以将所有功能都写在一个文件里,这样也是可行的,但是这样不利于代码的维护,你总不希 ...
- day24——面向对象三大特性、鸭子类型、类的约束、super的深度解析
day24 面向对象的三大特性 继承.封装.多态 封装:把一堆东西(代码,数据)放到一个地方(空间),并且可以使用 class Student: def __init__(self, name, se ...
- Python 面向对象(创建类和对象,面向对象的三大特性是指:封装、继承和多态,多态性)
概念: ...
- python基础学习Day17 面向对象的三大特性之继承、类与对象名称空间小试
一.课前回顾 类:具有相同属性和方法的一类事物 实例化:类名() 过程: 开辟了一块内存空间 执行init方法 封装属性 自动的把self返回给实例化对象的地方 对象:实例 一个实实在在存在的实体 组 ...
- python面向对象(类和对象及三大特性)
类和对象是什么 创建类 新式类 和 经典类 面向对象三大特性 继承 封装 多态 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...
- Python面向对象之:三大特性:继承,封装,多态以及类的约束
前言: python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情 ...
随机推荐
- Java io 入门
目录 前言 代码演练 字符流 FileReader,FileWriter: BufferedReader,BufferedWriter: InputStreamReader,OutputStreamW ...
- 记录使用Redis和nginx 实现一个简单的负载均衡(FB)
这两年在博客园看了不少大牛的分享,一直打算能写点什么东西. 之前偶然看见一个利用Redis 当作 Session数据宿主的demo,出处我已经找不到了.后来没事看了看nginx相关的东西.其中负载均衡 ...
- CSS背景和CSS列表
------------------------------ div{ background: red; width: 300px; ...
- 原生JS实现随着鼠标滚动到元素位置触发对应css3动画,简单易用滚动监测
预览链接:http://www.vanwee.cn/%E6%BB%9A%E5%8A%A8%E7%9B%91%E5%90%AC/ <style> body{overflow-x: hidde ...
- 如何去除vue项目中的 # --- History模式
来自:https://www.cnblogs.com/zhuzhenwei918/p/6892066.html 侵删 使用vue-cli搭建的环境,在配置好路由之后,可以看到下面的情况: 但是不难发现 ...
- jQuery与JS中的map()方法使用
1.jquery中的map()方法 首先看一个简单的实例: $("p").append( $("input").map(function(){ return $ ...
- HDU 1527 取石子游戏(威佐夫博弈)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...
- ACL技术总结
1.ACL的全称是访问控制列表,本质上是定义一组策略,以便指导报文在交换机内部的转发行为. 2.要配置策略,首先要明确ACL应用的对象,可以是针对端口,也可以是针对特殊的一条流. 针对端口,就是指端口 ...
- iOS------自动查找项目中不用的图片资源
注意:删除的时候要谨慎!别什么图都删了,看看对项目有没有作用.这个插件有时也会有一定的误差. 具体操作步骤: 1.去github上下载LSUnusedResources(下载地址:https://gi ...
- JMeter http(s)请求插件jmeter-plugin-httpBinaryFileUpload.jar
JMeter http(s)请求插件jmeter-plugin-httpBinaryFileUpload.jar by:授客 QQ:1033553122 1. 测试环境 apache-jmeter ...