1、基本概念
对象的含义是指具体的某一个事物,即在现实生活中能够看得见摸得着的事物。在面向对象程序设计中,对象所指的是计算机系统中的某一个成分。在面向对象程序设计中,对象包含两个含义,其中一个是数据,另外一个是动作。对象则是数据和动作的结合体。对象不仅能够进行操作,同时还能够及时记录下操作结果。
方法是指对象能够进行的操作,方法同时还有另外一个名称,叫做函数。方法是类中的定义函数,其具体的作用就是对对象进行描述操作。
继承简单地说就是一种层次模型,这种层次模型能够被重用。层次结构的上层具有通用性,但是下层结构则具有特殊性。在继承的过程中类则可以从最顶层的部分继承一些方法和变量。类除了可以继承以外同时还能够进行修改或者添加。通过这样的方式能够有效提高工作效率。在这里举一个例子,当类X继承了类Y后,此时的类X则是一个派生类,而类Y属于一个基类。 继承是从一般演绎到特殊的过程,可以减少知识表示的冗余内容,知识库的维护和修正都非常方便。更有利于衍生复杂的系统。
类是具有相同特性(数据元素)和行为(功能)的对象的抽象。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象,类实际上就是一种数据类型。类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。 [2] 类映射的每一个对象都具有这些数据和操作方法,类的继承具有层次性和结构性,高层次对象封装复杂行为,具体细节对该层次知识保持透明,可以减小问题求解的复杂度。
封装是将数据和代码捆绑到一起,对象的某些数据和代码可以是私有的,不能被外界访问,以此实现对数据和代码不同级别的访问权限。防止了程序相互依赖性而带来的变动影响,面向对象的封装比传统语言的封装更为清晰、更为有力。有效实现了两个目标:对数据和行为的包装和信息隐藏。
多态是指不同事物具有不同表现形式的能力。多态机制使具有不同内部结构的对象可以共享相同的外部接口,通过这种方式减少代码的复杂度。一个接口,多种方式。
动态绑定指的是将一个过程调用与相应代码链接起来的行为。动态绑定是指与给定的过程调用相关联的代码只有在运行期才可知的一种绑定,它是多态实现的具体形式。
消息传递:对象之间需要相互沟通,沟通的途径就是对象之间收发信息。消息内容包括接收消息的对象的标识,需要调用的函数的标识,以及必要的信息。消息传递的概念使得对现实世界的描述更容易。
面向对象的方法就是利用抽象、封装等机制,借助于对象、类、继承、消息传递等概念进行软件系统构造的软件开发方法。
上述内容摘自百度百科地址:https://baike.baidu.com/item/面向对象/2262089?fr=aladdin#3
一下所有讨论和代码基于python3.x。
2、属性
python中属性根据所属不同分为类属性和对象属性。
-
类属性
-
位置:和类中方法同级
-
访问和修改:可以通过类名.或者对象.访问
-
-
对象属性
- 定义:通过初始化方法__init()__或者对象.属性赋值动态添加
- 访问和修改:对象.属性访问和修改
-
示例
class Person: name = 'test01' p1 = Person() print(Person.name) print(p1.name) p2 = Person() print(Person.name) print(p2.name) p2.name = 'zhangsan' print(Person.name) print(p2.name) p1.age = 20 print(Person.age) print(p1.age)
-
解析:
- 当访问一个对象的属性时,先查找对象是否有该属性,有直接访问;没有继续查找外层(类)中是否有该属性,有直接访问,没有报错;
- 当给一个对象的属性赋值或者修改的时候,有直接赋值或者修改,没有会动态添加该属性。
- 当类属性和对象属性同名的时候,优先访问对象属性。
关于实例化时属性对象赋值,在下面魔术方法中讲解。
3、方法
python中方法根据功能不同分为:魔术方法、普通方法、类方法和静态方法。
3.1、魔术方法
-
格式
def __方法名__(self[,参数])__
-
常用魔术方法
魔术方法 | 说明 | 触发时机 |
---|---|---|
_init_(self[,参数]) | 实例化时初始化对象属性 | 构造方法,创建完空间后调用的第1个方法 |
_str_(self[,参数]) | 表示对象信息一个字符串 | 打印对象时调用 |
- 魔术方法(了解即可)
魔术方法 | 说明 | 触发时机 |
---|---|---|
_new_(self[,参数]) | 构建对象,开辟空间 | 对象创建时 |
_del_(sefl[,参数]) | 删除对象 | 没有指针引用的时候 |
_call_(self[,参数]) | 把对象当成函数用 | 把对象当成函数用时 |
-
示例
class Person: def __init__(self, name, age): self.name = name self.age = age def __str__(self): return '我叫' + self.name + ", 今年:" + str(self.age) + " 岁" p1 = Person("zhangsan", 20) print('我叫' + p1.name + ", 今年:" + str(p1.age) + " 岁") p2 = Person("李四", 25) print(p2)
-
解析
- _str_:默认打印对象为一串内存地址,一般情况下对我们来说没有什么意义,而我们想要知道对象的一些详细信息,所以重写该方法;return是必须的。
- _init_,它在对象初始化的时候调用,我们一般将它理解为"构造函数";在对象的生命周期结束时,
__del__
会被调用,可以将__del__
理解为"析构函数"。
3.2、普通方法
类中定义的方法,也称对象方法或实例方法。
-
格式
def 方法名(self[,参数]):
-
它最少也要包含一个 self 参数,用于绑定调用此方法的实例对象(Python 会自动完成绑定)
3.3、类方法
-
格式
@classmethod def 方法名(cls[,参数]):
-
它最少也要包含一个参数,只不过类方法中通常将其命名为 cls,Python 会自动将类本身绑定给 cls 参数
-
类方法需要使用
@classmethod
修饰符进行修饰 -
类方法推荐使用类名直接调用,当然也可以使用实例对象来调用(不推荐)
3.4、静态方法
-
格式
@staticmethod def 方法名([参数]):
-
静态方法没有类似 self、cls 这样的特殊参数
-
静态方法的调用,既可以使用类名,也可以使用类对象
3.5、对比
-
实例方法与类方法和静态方法对比
- 前者无需@装饰器修饰,后2者需要指定的@装饰器修饰
- 前期通过对象调用;后者可以通过类名直接调用
- 后2者在实际编程中很少使用,只在一些特殊场景使用
-
类方法和静态方法对比
- 类方法由@classmethod修饰;静态方法通过@staticmethod修饰
- 类方法至少包含cls参数;静态方法没有self或者cls等特殊参数
-
属性访问
- 类中方法只能使用类属性;实例方法只能使用对象属性;静态方法可以通过类名显示的使用类属性
-
方法访问
- 实例方法之间可以相互调用
- 普通方法可以通过类名显示调用类方法或者静态方法
- 类方法、静态方法不能调用实例方法
- 类方法和静态方法可以通过类名显示相互调用
-
示例
class Person: def __init__(self, name, age): self.name = name self.age = age def run(self): print(self.name + "在跑步..") Person.test01() @classmethod def test01(cls): print("类方法---", cls) Person.test02() @staticmethod def test02(): print("静态方法") # Person.test01() p1 = Person('小明', 15) p1.run() p1.test01() p1.test02()
4、私有化
普通属性外界可以随意访问,很不安全,所以我们需要进行封装。
-
步骤
- 私有化
- 属性前加__即为私有化
- 定义公有的set和get方法
- @peoperty装饰器
- @xxx.setter装饰器
- 由先后顺序
- 私有化
-
优点
- 隐藏属性不被外界随意修改
- 需要修改的情况下,通过函数修改
-
示例
class Student: def __init__(self, name, age): self.name = name self.__age = age @property def age(self): return self.__age @age.setter def age(self, age): self.__age = age def __str__(self): return '我叫{},今年{}岁'.format(self.name, self.__age) s1 = Student('小明', 20) print(s1.__dir__()) print(s1) s1.age = 25 print(s1)
-
属性封装之后可以通过对象.属性的方式直接访问
参考文章视频:
-
https://www.bilibili.com/video/BV1R7411F7JV 224~238
源代码仓库地址:https://gitee.com/gaogzhen/python-study