-
面向过程:将需要解决的问题按步骤划分,一步一步完成每一个步骤,而且 步骤之间有联系。
优点:复杂问题可以分步完成
缺点:扩展性很差,维护性差。如果中间某一环节有问题整体都会发生问题
使用的场景:对扩展性要求较低的软件,比如系统软件,脚本程序
面向对象(oop):将程序看作一堆对象的集合,实现功能的方式就是通过对象之间的交互来实现。
优点:扩展性高。对象之间的影响几乎没有
缺点:当某些程序不需要扩展性时书写就很复杂,无法预知结果
-
什么是对象?
对象就是具备某些特征与技能的结合体
-
什么是类?
类即类别、种类,是面向对象设计最重要的概念,对象是特征与技能的结合体,而类则是一系列对象相似的特征与技能的结合体
-
类与对象之间的关系
类的作用是标识对象与对象之间的差异
对象是某个类的实例。对象是实际的,类是抽象的
-
先有类还是先有对象?
在现实世界中:先有对象,再总结出类
在编程中:先有类,才能创建符合类特征的对象
总结:面对对象的思想就是用类和对象来解决问题
面对对象编程的本质:通过使用不同的对象来完成程序
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中类与对象及其绑定方法的定义
- 后端开发者的Vue学习之路(一) 后端开发者的Vue学习之路(一) 目录前言:iview组件库示例element组件库示例Vue的介绍学习Vue需要的前置知识:MVVM模型补充:安装/导入导入Vue安装两种方式的区别:HelloWorld示例代码分析:代码效果:实例中可以定义的内容定义数据定义方法methods生命周期与生命周期钩子函数补充:渲染插入文本v-textv-html用v-bind绑定属性:v-bind的简写把对象的所有属性绑定到元素:条
- 编写Java程序,模拟简单的计算器。 定义名为Number的类,其中有两个整型数据成员n1和n2,应声明为私有。编写构造方法,赋予n1和n2初始值,再为该类定义加(addition)、减(subtration)、乘(multiplication)、除(division)等公有成员方法,分别对两个成员变量执行加、减、乘、除的运算。 在main方法中创建Number类的对象,调用各个方法,并显示计算结
- Java 数据结构-特点: 代表一个队列,通常按照先进先出(FIFO)的顺序操作元素。 实现类: LinkedList, PriorityQueue, ArrayDeque。 堆(Heap) 堆(Heap)优先队列的基础,可以实现最大堆和最小堆。 PriorityQueue<Integer minHeap = new PriorityQueue<>; PriorityQueue<Integer maxHeap = new PriorityQueue<>(Collections.reverseOrder); 树(Trees) Java 提供了 TreeNode 类型,可以用于构建二叉树等数据结构。 class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } 图(Graphs) 图的表示通常需要自定义数据结构或使用图库,Java 没有内建的图类。 以上介绍的只是 Java 中一些常见的数据结构,实际上还有很多其他的数据结构和算法可以根据具体问题选择使用。 其他一些说明 以下这些类是传统遗留的,在 Java2 中引入了一种新的框架-集合框架(Collection),我们后面再讨论。 枚举(Enumeration) 枚举(Enumeration)接口虽然它本身不属于数据结构,但它在其他数据结构的范畴里应用很广。 枚举(The Enumeration)接口定义了一种从数据结构中取回连续元素的方式。 例如,枚举定义了一个叫nextElement 的方法,该方法用来得到一个包含多元素的数据结构的下一个元素。 关于枚举接口的更多信息,请参见枚举(Enumeration)。 位集合(BitSet) 位集合类实现了一组可以单独设置和清除的位或标志。 该类在处理一组布尔值的时候非常有用,你只需要给每个值赋值一"位",然后对位进行适当的设置或清除,就可以对布尔值进行操作了。 关于该类的更多信息,请参见位集合(BitSet)。 向量(Vector) 向量(Vector)类和传统数组非常相似,但是Vector的大小能根据需要动态的变化。 和数组一样,Vector对象的元素也能通过索引访问。 使用Vector类最主要的好处就是在创建对象的时候不必给对象指定大小,它的大小会根据需要动态的变化。 关于该类的更多信息,请参见向量(Vector) 栈(Stack) 栈(Stack)实现了一个后进先出(LIFO)的数据结构。 你可以把栈理解为对象的垂直分布的栈,当你添加一个新元素时,就将新元素放在其他元素的顶部。 当你从栈中取元素的时候,就从栈顶取一个元素。换句话说,最后进栈的元素最先被取出。 关于该类的更多信息,请参见栈(Stack)。 字典(Dictionary) 字典(Dictionary) 类是一个抽象类,它定义了键映射到值的数据结构。 当你想要通过特定的键而不是整数索引来访问数据的时候,这时候应该使用 Dictionary。 由于 Dictionary 类是抽象类,所以它只提供了键映射到值的数据结构,而没有提供特定的实现。 关于该类的更多信息,请参见字典( Dictionary)。 Dictionary 类在较新的 Java 版本中已经被弃用(deprecated),推荐使用 Map 接口及其实现类,如 HashMap、TreeMap 等,来代替 Dictionary。
- Hibernate中对象的三种状态以及Session类中saveOrUpdate方法与merge方法的区别
- python: 面向对象:类和对象调用类中的变量和方法
- 第7.15节 Python中classmethod定义的类方法详解
- 全面解析python类的绑定方法与非绑定方法
- Python中自定义类如果重写了__repr__方法为什么会影响到str的输出?
- 关于PHP面向对象中—类的定义与对象的实例化操作以及构造、析构函数的特殊用法