面向对象编程

  • 什么是面向对象?

    面向过程:将需要解决的问题按步骤划分,一步一步完成每一个步骤,而且          步骤之间有联系。

    优点:复杂问题可以分步完成

    缺点:扩展性很差,维护性差。如果中间某一环节有问题整体都会发生问题

    使用的场景:对扩展性要求较低的软件,比如系统软件,脚本程序

    面向对象(oop):将程序看作一堆对象的集合,实现功能的方式就是通过对象之间的交互来实现。

    优点:扩展性高。对象之间的影响几乎没有

    缺点:当某些程序不需要扩展性时书写就很复杂,无法预知结果

  • 什么是对象?

    对象就是具备某些特征与技能的结合体

  • 什么是类?

    类即类别、种类,是面向对象设计最重要的概念,对象是特征与技能的结合体,而类则是一系列对象相似的特征与技能的结合体

  • 类与对象之间的关系

    类的作用是标识对象与对象之间的差异

    对象是某个类的实例。对象是实际的,类是抽象的

  • 先有类还是先有对象?

    在现实世界中:先有对象,再总结出类

    在编程中:先有类,才能创建符合类特征的对象

总结:面对对象的思想就是用类和对象来解决问题

面对对象编程的本质:通过使用不同的对象来完成程序

1.类和对象的使用

  1. 类的定义:

    怎么定义类?

    class ThisIsPerson:  #定义一个ThisIsPerson的对象
    #用变量描述特性
    name = 'ming'
    age = 28
    ​ #这就是一个类的定义
    #注意类名在书写上用大驼峰体,每个英文字母首字母大写

2.对象

对象怎么来?

class ThisIsPerson:
name = 'ming'
age = 28
#得到对象
obj = ThisIsPerson()
#调用类可以获得对象,调用也称为实例化或创建对象
print(obj)
<__main__.ThisIsPerson object at 0x000001CCA7C38390>
#使用对象的属性
print(obj.name)
print(obj.age)
ming
28

#注意:
1.类中可以有任意python代码,这些代码在类定义阶段便会执行
2.因而会产生新的名称空间,用来存放类的变量名与函数名,可以通过ThisIsPerson.__dict__查看
3.对于经典类来说我们可以通过该字典操作类名称空间的名字(新式类有限制),但python为我们提供专门的.语法
4.点是访问属性的语法,类中定义的名字,都是类的属性
#
#例如
#创建了两个对象
obj1 = ThisIsPerson()
obj2 = ThisIsPerson()
print(obj1)
print(obj2)
<__main__.ThisIsPerson object at 0x000001E381B684A8>
<__main__.ThisIsPerson object at 0x000001E381B684E0>
#我们通过两个对象说明了内存地址不一样
print(obj1.name)
print(obj2.name)
ming
ming
print(id(obj1.name))
print(id(obj2.name))
2048312521536
2048312521536
#两个对象的name属性都一样,而且ID指向同一个内存地址,这是因为name的属性是在类中创建的所以每个对象使用的都是同一份属性
#为对象单独制定属性
obj1.name = 'xian'
print(obj1.name)
print(obj2.name)
xian
ming
print(obj1.__dict__)
{'name': 'xian'}
#输出的结果说明对象可以存放属性,有自己的名称空间

#注意:属性的存放位置
1.存放属性的位置有两个,一个在类中,一个在对象中
2.当每个对象的某个特征都想同时,属性应该放在类中
3.当每个对象的某个特征不同时,这个属性就应该放在对象中
4.通过.__dict__可以获取对象中包含的内容

2.类和对象中属性被访问的顺序

#我们还是拿刚才的例子说明
class ThisIsPerson:
name = 'ming'
age = 28
obj1 = ThisIsPerson()
obj2 = ThisIsPerson()

print(obj1.__dict__)
print(obj2.__dict__)
{} #我们查看对象obj1,obj2,发现其中都没有内容。
{} #为什么会有name属性?
print(obj1.name)
print(obj2.name)
ming
ming #两个对象都获得了name属性ming
#1.说明当对象中没有属性时,对象会去找类要该属性
obj1.name = 'xian' #给obj1换个name属性
print(obj1.__dict__)
print(obj2.__dict__)
{'name': 'xian'}
{}

print(obj1.name)
print(obj2.name)
xian #输出xian说明使用了对象的属性
ming
#2.说明对象中如果存在这个属性,优先使用对象中的属性

#注意
1.当创建一个类的时候会产生一个存放类属性的名称空间,存储类中属性和值的绑定关系
2.当生成一个对象时,同样也会产生一个存放对象属性的名称空间,存储对象中属性和值的绑定关系。
3.初始化函数(__init__方法)
#前面我们已经知道了类的定义以及类和对象的生成,类和对象的属性设置
class ThisIsPerson:
name = 'ming'
age = 28
#如果现在我有三个对象需要生成。按照之前办法
#生成三个对象
obj1 = ThisIsPerson()
obj2 = ThisIsPerson()
obj3 = ThisIsPerson()
#现在,这三个对象的属性都不相同,添加不同属性
obj1.name = 'yanghetiji'
obj1.age = 25
obj2.name = 'qiaoshangtiji'
obj2.age = 24
obj3.name = 'banshangpotiji'
obj3.age = 26
print(obj1.__dict__)
print(obj2.__dict__)
print(obj3.__dict__)
{'name': 'yanghetiji', 'age': 25}
{'name': 'qiaoshangtiji', 'age': 24}
{'name': 'banshangpotiji', 'age': 26}
#我们需要一个个添加不同属性,如果有一万个?怎么办?
#我们肯定想到用一个函数去处理这些数据不用每次都写重复代码
#那我们定义一个函数,用于设置属性
def set_attribute(obj, name, age):
obj.name = name
obj.age = age
obj1 = ThisIsPerson()
obj2 = ThisIsPerson()
obj3 = ThisIsPerson()
set_attribute(obj1,'yanghetiji',25) #调用函数,添加属性
set_attribute(obj2,'qiaoshangtiji',24)
set_attribute(obj3,'banshangpotiji',26)
print(obj1.__dict__)
print(obj2.__dict__)
print(obj3.__dict__)
#输出
{'name': 'yanghetiji', 'age': 25}
{'name': 'qiaoshangtiji', 'age': 24}
{'name': 'banshangpotiji', 'age': 26}

#这种方式每次添加还是需要调用一次函数,我们设想下可不可以将这个函数写到类中,让后去调用
class ThisIsPerson:
def set_attribute(obj, name, age):
obj.name = name
obj.age = age
obj4 = ThisIsPerson()
ThisIsPerson.set_attribute(obj4, 'liuhetiji', 23)
print(obj4.__dict__)
{'name': 'liuhetiji', 'age': 23}
#可以写入到类中,但是还是很麻烦,再次优化
#我们知道,这些属性是我们对象在产生时就应该有的,因为光说'tieji'你不知道☞那个。这个时候我们需要用我们的内置方法__init__方法了

class ThisIsPerson:
def __init__(self, name, age):
#第一个参数表示初始化的对象本身,这其实也是一个对象方法
self.name = name
self.age = age

obj5 = ThisIsPerson('daidai', 26)
print(obj5.__dict__)
{'name': 'daidai', 'age': 26}
# 强调:
# 1、该方法内可以有任意的python代码
# 2、一定不能有返回值
# 3、该方法参数self建议不要修改,而且解释器会自动传值,不要传参数

4.类与对象的绑定方法

  • 什么是绑定方法?

方法就是函数,面向对象编程中函数就是方法。绑定方法就是对象或类与函数进行绑定。

绑定方法有两种,一种是绑定给对象,一种是绑定给类

  • 为什么要绑定?

对象本质上就是存放数据的容器,绑定方法就是将函数与数据绑定在一起,这个函数的功能就是处理数据。

  • 为什么要将这样的函数和数据绑定?如何使用?

#1.对象的绑定方法
class ThisIsPerson:
address = 'LiuHe'
def __init__(self, name, age):
self.name = name
self.age = age
def print_info(self): #这就是一个绑定给对象的方法
print('%s

python中类与对象及其绑定方法的定义的更多相关文章

  1. python中类与对象之继承

    面对对象的三大特性之继承 1.什么是继承? 在程序中,继承指的是class与class之间的关系 继承是一种关系,必须存在两个class才能产生这种关系:被继承的class称为父类,继承的class称 ...

  2. 类的封装,property特性,类与对象的绑定方法和非绑定方法,

    类的封装 就是把数据或者方法封装起来 为什么要封装 封装数据的主要原因是:保护隐私 封装方法的主要原因是:隔离复杂度(快门就是傻瓜相机为傻瓜们提供的方法,该方法将内部复杂的照相功能都隐藏起来了,比如你 ...

  3. javascript对象事件绑定方法

    javascript对象事件绑定方法 今天在做对象事件绑定的过程中出现了一点异外情况,由于事件方法是由参数传过来的,需要将当前对象call过去,方便方法体里直接调用this 错误写法 obj.oncl ...

  4. python 3 属性查找与绑定方法

    1.属性查找 类有两种属性:数据属性和函数属性 (1)类的数据属性是所有对象共享的 #类的数据属性是所有对象共享的,id都一样 class OldboyStudent: school='oldboy' ...

  5. python 面向对象之多态与绑定方法

    多态与多态性 一,多态 1,多态指的是一类事物有多种形态(python里面原生多态) 1.1动物有多种形态:人,狗,猪 import abc class Animal(metaclass=abc.AB ...

  6. python 封装,隐藏属性,绑定方法classmethod和staticmethod

    [封装] 隐藏对象的属性和实现细节,仅对外提供公共访问方式. [好处] 1. 将变化隔离: 2. 便于使用: 3. 提高复用性: 4. 提高安全性: [封装原则] 1. 将不需要对外提供的内容都隐藏起 ...

  7. DAY7-面向对象之绑定方法与非绑定方法

    一.类中定义的函数分成两大类 一:绑定方法(绑定给谁,谁来调用就自动将它本身当作第一个参数传入): 1. 绑定到类的方法:用classmethod装饰器装饰的方法. 为类量身定制 类.boud_met ...

  8. python-面向对象(绑定方法与非绑定方法)

    一.绑定方法: 绑定给谁就应该由谁来调用,谁来调用就会将谁当做第一个参数传入 1.绑定给对象的方法:类中定义的函数默认就是绑定给对象的,自动将对象当作第一个参数传入,类也可以调用,但是不会自动传值 2 ...

  9. python类中保存非绑定方法作为成员函数

    习惯了函数式,动不动传一个函数.但是直接把函数作为类方法保存,再调用时会报错. 举一个unittest时的例子 class MyTestCase(unittest.TestCase): @classm ...

随机推荐

  1. 说说VBA中的面向对象

    对象是 Visual Basic 的结构基础,在 Visual Basic 中进行的所有操作几乎都与修改对象有关.Microsoft Word 的任何元素,如文档.表格.段落.书签.域等,都可用 Vi ...

  2. openFileDialog的使用

    这两天应用了一下openFileDialog,做的是上传的功能,在打开页面的时候进行的一系列操作虽说远远没有asp.net的上传控件好使,但是学习起来也是蛮还用的,下面是一个简单的应用 //点击浏览按 ...

  3. 指向函数的指针 ------ 函数指针(function pointer)

    函数指针: 指向函数的指针, 首先是一个指针, 这个指针指向一个函数. 函数具有可赋值给指针的物理内存地址,一个函数的函数名就是一个指针,它指向函数的代码.一个函数的地址是该函数的进入点,也是调用函数 ...

  4. https加载非https资源时不出现问题

    老规矩,国服第一博客copy王,原文链接:https://blog.csdn.net/zhengbingmei/article/details/81325325将系统变成了https访问之后,发现部分 ...

  5. python txt文件常用读写操作

    文件的打开的两种方式 f = open("data.txt","r") #设置文件对象 f.close() #关闭文件 #为了方便,避免忘记close掉这个文件 ...

  6. EtherCAT 要点

    倍福: 1.倍福的每个从站模块(IO模块)一般都有转换时间而这些时间会导致从站模块输出数值存在延迟,举例:当在15:00开始调用API让主站板卡输出数据,而用示波器实际检测到模块输出数值的时间大约在1 ...

  7. DL服务器主机环境配置(ubuntu14.04+GTX1080+cuda8.0)解决桌面重复登录

    DL服务器主机环境配置(ubuntu14.04+GTX1080+cuda8.0)解决桌面重复登录 前面部分是自己的记录,后面方案部分是成功安装驱动+桌面的正解 问题的开始在于:登录不了桌面,停留在重复 ...

  8. 修改postgres密码

    转载自:https://www.cnblogs.com/kaituorensheng/p/4735191.html   1. 修改PostgreSQL数据库默认用户postgres的密码 Postgr ...

  9. Spring Cloud(Dalston.SR5)--Config 集群配置中心

    Spring Cloud Config 是一个全新的项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,他分为服务端和客户端两个部分.服务端也称为分布式配置中心,是一个独立的微服务 ...

  10. powershell中设置变量并启动Tomcat

    假设tomcat安装在 C:\GreenSoftware\apache-tomcat-9.0.14 目录. 使用powershell进入到此目录.执行命令 $Env:JAVA_HOME="C ...