1.面向过程编程 2.面向对象编程 3.类和对象 4.python 创建类和对象 如何使用对象 5.属性的查找顺序 6.初始化函数 7.绑定方法 与非绑定方法
1.面向过程编程
面向过程:一种编程思想
在编写代码时 要时刻想着过程这个两个字
过程指的是什么? 解决问题的步骤 流程,即第一步干什么 第二步干什么,
其目的是将一个复杂的问题,拆分为若干的小的问题,按照步骤一一解决,
也可以说 将一个复杂的问题,流程化(为其制定一个固定的实现流程),从而变得简单化
例如:要将大象装进冰箱
打开冰箱
装进大象
关闭冰箱门
以上实现方式 是面向过程的实现方式
面向过程编程优缺点:
优点:复杂的问题,简单化,
缺点:由于其实现流程是固定的,一旦中间某一个步骤发生了修改,将导致整体都需要修改
牵一发动全身.解释:本来有一个实现某个功能的固定的流程,后来需要在原来的基础上增加新的功能,这时候得全部重新设计一遍
扩展性差,维护性差
例如工厂里流水线,一旦中间某个岗位出来问题,整体就无法正常运行,第一个没做完,第二个做不了
使用场景:对扩展性要求较低的软件,比如系统内核,脚本程序(运维工程师写的程序,其目的就是安装一堆软件),Apache HTTP服务器
2.面向对象编程
面向对象:一种编程思想,即编写代码的方式方法
OOP,是Object oriented Programming的简称
将程序看做是一堆对象的集合,实现功能的方式就是对象之间交互来实现
例如:要开一家公司
1.雇个财务
2.雇个人事主管
3.雇几个伙计
4.雇个秘书
5.给他们下达命令
以上方式不是面向过程,为什么?因为其不关系 财务如何算账,也不关心人事如何招人,只关心给他们下达命令
而是面向对象是: 财务,人事主管,几个伙计,秘书
面向对象的优缺点:
优点:
1.不用考虑繁琐的实现步骤,从一个操作工,变成了老板
2.扩展性高了,当需要一个新功能时,搞一个具备新功能的对象,命令它去完成任务
3.各个对象之间的耦合度低,当一个一个对象出现了问题,不会对其他对象产生影响
4.可维护性高
缺点:
1.面向对象的复杂度比面向过程高
2.无法预知执行结果,就像lol的游戏过程,一定不能把过程写死,每个英雄的行为是不固定的
使用场景:需要较高的扩展性时,(直接与用户发生交互的程序例如,qq微信),对于不需要扩展的程序而言,使用面向对象反而增加了复杂度
面向对象编程的本质,就是使用不同的对象来完成程序
面向对象思想中最核心的概念就是 类与对象
3.类与对象
什么是对象?
一切皆对象
对象指的是,具备某些特征与技能的结合体,是实实在在存在的具体物体(描述完我就能找到它)
什么是类?
类就是类型,类别,分类
类是一个抽象概念,不是实际存在的,是根据一些具备相同特征和技能的对象抽取得到的,比如说人类.类的作用是用于标识对象与对象之间的差异,通过类就能大致了解一个对象的特征和行为
类与对象之间的关系
类包含了一系列相同特征和技能的对象
对象是属于某个类的实例
先有类还是先有对象?
在生活中是先有对象再根据对象的特征和技能 得到一个类型
在程序中先有类还是先有对象
程序员在程序中相当于上帝 需要什么就创造什么
先有类 才能通过类来产生对象,要先确定对象具备什么特征和什么行为才能产生对象
在计算机创建一个人类对象
要得到对象,必须先告诉计算机,这个对象具备什么特征和行为,所以需要先定义类
class Person: #注类名要按照大驼峰的方式来书写 ThisIsPerson 每个单词的首字母都大写
name='herny'
age='29'
sex='man' #在类中描述对象的特征和行为
obj=Person() #得到对象 通过调用类 ,也称之为实例化 或 创建对象
print(obj)
# 结果:<__main__.Person object at 0x00000279452B7C50>
# 模块名为main 其包含一个Person类 通过Person类产生了一个对象 地址为0x00000279452B7C50
# 这是一个Person类的对象 其地址为0x00000279452B7C50
print(obj.name)
print(obj.age)
print(obj.sex) # 使用对象的属性(说的就是特征)
# 存储属性的位置有两个 一个是类中,还有一个对象中
# 当每个对象的某个特征都相同时则放到类中
# 当每个对象的某个特征都不同时则放到对象中
class Student:
school='Marquette'
number='3'
name='Wade'
sex='man'
age='36'
# 创建了两个学生对象
stu1=Student()
stu2=Student()
# 每个对象内存地址都是不同的 , 在创建对象时,计算机会申请一个新的内存空间,并将对象中的内容存进去
print(stu1)
print(stu2)
# 由于name的值是声明在类中的,所以每个对象使用的都是同一个值
print(stu1.name)
print(stu2.name)
# 为对象单独制定属性
stu1.name='James'
stu2.name='Bosh'
print(stu1.name)
print(stu2.name)
# 通过__dict__可以获取一个对象中包含的内容
print(stu1.__dict__)
print(stu2.__dict__)
# 获取类中包含的内容
print(Student.__dict__)
4.python创建类和对象
在计算机创建一个人类对象
要得到对象,必须先告诉计算机,这个对象具备什么特征和行为,所以需要先定义类
class Person: #注类名要按照大驼峰的方式来书写 ThisIsPerson 每个单词的首字母都大写
name='herny'
age='29'
sex='man' #在类中描述对象的特征和行为
obj=Person() #得到对象 通过调用类 ,也称之为实例化 或 创建对象
print(obj)
# 结果:<__main__.Person object at 0x00000279452B7C50>
# 模块名为main 其包含一个Person类 通过Person类产生了一个对象 地址为0x00000279452B7C50
# 这是一个Person类的对象 其地址为0x00000279452B7C50
print(obj.name)
print(obj.age)
print(obj.sex) # 使用对象的属性(说的就是特征)
# 存储属性的位置有两个 一个是类中,还有一个对象中
# 当每个对象的某个特征都相同时则放到类中
# 当每个对象的某个特征都不同时则放到对象中
class Student:
school='Marquette'
number='3'
name='Wade'
sex='man'
age='36'
# 创建了两个学生对象
stu1=Student()
stu2=Student()
# 每个对象内存地址都是不同的 , 在创建对象时,计算机会申请一个新的内存空间,并将对象中的内容存进去
print(stu1)
print(stu2)
# 由于name的值是声明在类中的,所以每个对象使用的都是同一个值
print(stu1.name)
print(stu2.name)
# 为对象单独制定属性
stu1.name='James'
stu2.name='Bosh'
print(stu1.name)
print(stu2.name)
# 通过__dict__可以获取一个对象中包含的内容
print(stu1.__dict__)
print(stu2.__dict__)
# 获取类中包含的内容
print(Student.__dict__)
5.属性的查找顺序
"属性的访问顺序"
1.当对象中不存在这个属性时会到类中去找
2.如果对象中存在这个属性,优先访问对象中的属性
查找顺序为 对象 -> 类
class Student:
name='Wade'
age='18'
sex='man'
stu1=Student()
print(stu1.name)
stu1这个对象中没有数据,就回到类Student里面去找.
结果:Wade
class Student:
name='Wade'
age='18'
sex='man'
stu1=Student()
stu1.name='James'
print(stu1.name)
对象中存在这个属性,所以直接取对象中的数据
结果:James
当创建一个类的时候 会产生名称空间,存储类中名称和值的绑定关系
当创建一个对象的时候 会产生名称空间,存储对象中名称和值的绑定关系
类还有另一个作用 就是 作为对象的模板,所有属于同一个类的对象,都具备类中的公共内容
即使我们什么都不写 类中也存在一些自带的属性,是从父类得到的(继承会详细讨论)
6,初始化函数
class Student:
pass
stu1=Student()
stu2=Student()
#指定属性
stu1.name='Wade'
stu1.age='36'
stu1.sex='man'
stu2.name='Wendy'
stu2.age='24'
stu2.sex='woman'
print(stu1.name)
print(stu2.age)
有上述方法太繁琐,于是我们建立函数来解决,创建这个函数目的是用于设置对象的属性 ,如果没有对象则该函数没有存在的意义,也就是初始化函数与类应该是一个整体,应该讲这个函数放到类中.
class Student():
def msg(obj,name,age,sex):
obj.name=name
obj.age=age
obj.sex=sex
stu1=Student()
Student.msg(stu1,'Wade',36,'man')
print(stu1.name)
现在已经简化了代码 但是对象的创建和初始化步骤是分开的, 通常对象一旦创建 就应该进行初始化,所以最好时将创建与初始化进绑定
作为一个人 一旦出生 性别必须要指定
# 带有__开头__结尾的函数 是一些特殊内置函数,会在某个时间点自动触发执行
class Person:
# 初始化函数名称是固定 该函数会在调用类是时自动执行,self参数必须有,表示要进行初始化的对象,系统会自动传值
def __init__(self,name,age):
print('执行了__init__')
print(self)
self.name=name
self.age=age
p1=Person('henry',29)
print(p1.__dict__)
# init 函数用于初始化对象,它会在创建对象时,自动执行,并传入调用类时传递的参数,第一个参数表示要初始化的对象本身.
# self(第一个)参数不需要手动传递
# self表示对象自己 是一个形式参数,名字可以随便取,但是不建议修改
小练习: 有一个Dog类 每一个Dog对象都应该会叫 会跑 请用面向对象来完成
class Dog():
def __init__(self,dogname,gender,age):
self.dogname=dogname
self.gender=gender
self.age=age
def call(self):
print('你们听%s又叫了'%self.dogname)
def run(self):
print('你们看%s又跑了'%self.dogname)
dog1=Dog('皮皮','公','3')
dog2=Dog('科科','母','2')
dog1.run()
dog2.call()
7.对象绑定方法与非绑定方法
1.绑定方法是什么?
什么是绑定 把两个东西捆绑在一起
什么是方法 方法 就是 函数
函数是专业术语,不好理解,面向对象编程思想,是要我们模仿现实生活中的抽象概念,为了方便理解就把函数称之为方法.
绑定方法就是 把对象与函数进行绑定
对象本质上就是一种存放数据的容器
函数是用于处理数据的代码
绑定方法就是将数据与处理数据的函数绑定在一起
2.为什么要把把对象与函数进行绑定?
name = "henry"
age = 29
sex = "男"
name2 = "wendy"
age2 = 24
sex2 = "女"
def show_info(name,age,sex):
print("hello i am %s my age:%s my sex:%s" % (name,age,sex))
show_info(name2,sex2,age2)
show_info(name,sex,age)
第一个问题传递参数,必须手动传递,很有可能传参顺序而发生错误
第二个问题每次处理数据 都需要手动传参数
第三个问题 当要处理的数据特别的多 就不能再定义为变量了 你可以使用列表出来存储要处理的数据
但是 每次处理 都需要先获取数据 在传递给处理数据的函数
所以将 要处理的数据与 处理数据的函数进行绑定
调用函数 就变成了调用对象的方法
默认情况下 在类中定义的函数都是绑定方法,共同点是,都会将对象作为第一个参数self
class Student:
school = "BeiJing"
def __init__(self,name,sex,age):
self.name = name
self.sex = sex
self.age = age
def learning(self):
print("正在学习..")
def sayHI(self):
print("hello my name is %s my age:%s my sex:%s" %(self.name,self.age,self.sex))
stu1 = Student("zion","man",18)
stu1.sayHI()
当用用对象来调用类中的方法时,默认把对象传入方法中
Student.sayHI(stu1)
而用类名来调用时,则需要手动传入对象
只要拿到对象 就同时拿到了数据和处理数据的方法
3.绑定方法分为两种 一种是绑定给对象的,一种绑定给类的
class Student:
school = "beijing"
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
绑定给类的:
绑定给类的方法使用一个装饰器叫classmethod,必须有一个参数,表示当前类,参数名也可以自己定义,建议不要修改
@classmethod
def print_school_name(cls): # 输出类里面叫school的属性
print(cls.school)
绑定给对象的:
def say_hi(self):
print(self.name, " 说: 你好")
Student.school_msg()
#类的绑定方法,对象和类都能调用,并且都会自动传入这个类
stu1=Student('irene','27','woman')
Student.say_hi(stu1)
# 对象绑定方法 可以使用对象来调用 也可以使用类名来调用
# 在对象调用时会自动传入对象自己
# 类调用时不会自动传参
一个方法到底应该绑定给对象还是绑定给类?
当要处理的数据包含在类中时,就应该绑定给类
当要处理的数据包含在对象中时,就应该绑定给对象
总结:
"""
# 类的绑定方法和对象的绑定方法的相同与不同
相同点:
1.都会自动传值
2.都可以被类和对象调用
不同点:
1.对象绑定方法再对象调用时 传的是对象自己 而类绑定方法字自动传的是类自己
2.第一个参数 个cls 一个叫self
为什么要绑定?
# 第一个问题传递参数,必须手动传递,很有可能传参顺序而发生错误
# 第二个问题每次处理数据 都需要手动传参数
# 第三个问题 当要处理的数据特别的多 就不能再定义为变量了 你可以使用列表出来存储要处理的数据
但是 每次处理 都需要先获取数据 在传递给处理数据的函数
之所以绑定 ,简化代码,提高效率
class Teacher:
def __init__(self,name,sex):
self.name = name
self.sex = sex
# @staticmethod 用于定义个非绑定方法
@staticmethod
def test_func(num):
print("test_func run!")
print(num)
Teacher.test_func(1)
t1 = Teacher("wendy","woman")
t1.test_func(100)
print(t1.test_func)
# 什么是非绑定方法 在类中 即不绑定给类 也不绑定给对象
# 特点:没有自动传参数的效果 ,类和对象向都能调用,就是一个普通函数
# 当你的这个功能不需要访问类的数据 也不需要访问对象的数据,就可以作为一个非绑定方法
# 使用场景较少
小练习:
1.创建Student类
2.拥有以下属性: 姓名 性别 年龄 学校 班级
3.拥有以下方法
save(name) 其作用是将这个对象序列化到文件中
get_obj(name) 其作用是根据name从文件中反序列化为得到一个对象
分析save方法和get_obj 应该作为绑定给对象还是绑定给类
import json
class Student:
school='pking'
def __init__(self,name,sex,age,classes):
self.name=name
self.sex=sex
self.age=age
self.classes=classes
def save(self):
dic={'name':self.name,'age':self.age,'sex':self.sex,'classes':self.classes}
with open(self.name,'wt',encoding='utf-8') as f:
json.dump(dic,f)
@classmethod
def get_obj(cls,name):
with open(name,'rt',encoding='utf-8') as f:
dic=json.load(f)
obj=cls(dic['name'],dic['sex'],dic['age'],dic['classes'])
return obj
# stu1=Student('henry','man','29','python五期')
# stu1.save()
stu1=Student.get_obj('henry')
print(stu1.name)
1.面向过程编程 2.面向对象编程 3.类和对象 4.python 创建类和对象 如何使用对象 5.属性的查找顺序 6.初始化函数 7.绑定方法 与非绑定方法的更多相关文章
- Python面向对象之封装、property特性、绑定方法与非绑定方法
一.封装 ''' 1.什么封装 封:属性对外是隐藏的,但对内是开放的(对内是开放的是因为在类定义阶段这种隐藏已经发生改变) 装:申请一个名称空间,往里装入一系列名字/属性 2.为什么要封装 封装数据属 ...
- 全面解析python类的绑定方法与非绑定方法
类中的方法有两类: 绑定方法 非绑定方法 一.绑定方法 1.对象的绑定方法 首先我们明确一个知识点,凡是类中的方法或函数,默认情况下都是绑定给对象使用的.下面,我们通过实例,来慢慢解析绑定方法的应用. ...
- 类的封装,property特性,类与对象的绑定方法和非绑定方法,
类的封装 就是把数据或者方法封装起来 为什么要封装 封装数据的主要原因是:保护隐私 封装方法的主要原因是:隔离复杂度(快门就是傻瓜相机为傻瓜们提供的方法,该方法将内部复杂的照相功能都隐藏起来了,比如你 ...
- 面向对象(四)--绑定方法与非绑定方法(classmethod、staticmethod装饰器)
一.绑定方法与非绑定方法 1.绑定方法(绑定给谁,谁来调用就自动将它本身当作第一个参数传入): (1)绑定给对象的方法:在类内部定义的函数(没有被任何装饰器修饰的)默认就是绑定给对象用的. (2)绑定 ...
- 面向对象(四)——classmethod、staticmethod装饰器(绑定方法与非绑定方法)
classmethod.staticmethod装饰器 一.绑定方法与非绑定方法 1.绑定方法(绑定给谁,谁来调用就自动将它本身当作第一个参数传入): (1) 绑定到类的方法:用classmethod ...
- Learning-Python【25】:绑定方法与非绑定方法
类中定义函数分为了两大类,绑定方法与非绑定方法,它们有一些特殊之处: 1.绑定方法特殊之处:绑定给谁就应该由谁来调用,谁来调用就会将谁当做第一个参数自动传入 绑定给对象的方法:这个在面向对象第一篇第六 ...
- Python开发基础-Day21多态与多态性、绑定方法和非绑定方法
多态与多态性 多态 多态并不是一个新的知识 多态是指一类事物有多种形态,在类里就是指一个抽象类有多个子类,因而多态的概念依赖于继承 举个栗子:动物有多种形态,人.狗.猫.猪等,python的序列数据类 ...
- python基础之多态与多态性、绑定方法和非绑定方法
多态与多态性 多态 多态并不是一个新的知识 多态是指一类事物有多种形态,在类里就是指一个抽象类有多个子类,因而多态的概念依赖于继承 举个栗子:动物有多种形态,人.狗.猫.猪等,python的序列数据类 ...
- static方法与非static方法是否可以互相调用
情况一.static方法调用非static方法 非静态方法只有实例对象才可调用,而静态方法随着类的加载而加载,类的加载在实例对象产生之前,所以静态方法不能调用非静态方法 情况二.非atic方法调用st ...
随机推荐
- unity3d-游戏实战突出重围,第四天 添加角色
1:添加unity自带的第一人称角色控制器,命名为hreo 2:添加第三人称角色控制器.这里是添加源文件Sources下面的.如箭头指示:而不是“3rd Person Controller”.并命名为 ...
- 014-Session服务器状态保持
开始并为Session赋值:Session[“uName”]=“CNYaoMing”;取值:string strName = Session[“uName”].ToString();销毁(取消/退出) ...
- C# And Java 3DES加解密 ECB模式/PKCS7
c#: /// <summary> /// 完整 /// </summary> public class TripleDESHelper1 { ...
- word之删除图标目录之间的空行
在生成图表目录时,发现Office word图表目录中多个标题之间的空行无法删除,我是自己建的标签,比如“图1-”.“图2-”…….“表1-”.“表2-”…… 发现“图1-”.“图2-”…….“表1- ...
- mac快捷键留存查看
基本的快捷键 Command是Mac里最重要的修饰键,在大多数情况下相当于Windows下的Ctrl.所以以下最基本操作很好理解: Command-Z 撤销 Command-X 剪切 Command- ...
- js原型链的说明
首先需要明确的是:只有对象有__proto__属性,而函数只有prototype属性,没有__proto__属性,函数的原型有一个constructor属性,指向的是函数本身! Function是Ob ...
- 【impala学习之二】impala 使用
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 CM5.4 一.Impala shell 1.进入impal ...
- 设置Source Insight显示格式
调整字体大小 默认的忍不了,百度之,解决方案如下:1.Document Options -> Screen Fonts -> 字体设置为新宋体(等宽)或者其他支持中文的字体,字符集选GB2 ...
- sql之left join、right join、inner join的区别,连接自己时的查询结果测试
sql之left join.right join.inner join的区别 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括 ...
- LINUX安装REDIS集群
linux安装单机版redis已经在另一篇文章说过了,下边来搞集群,环境是新浪云服务器: redis3.0以后开始支持集群. 前言:redis用什么做集群? 用一个叫redis-trib.rb的rub ...