面向对象
Posted thinkingjxj
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象相关的知识,希望对你有一定的参考价值。
1. 什么是面向对象?
一种认知世界、分析世界的方法论。将万事万物抽象为类。
2. 类:class
类是抽象的概念,是万事万物的抽象,是一类事物的共同特征的集合。
用计算机语言来描述类,就是属性和方法的集合。
3. 对象instance、object
对象是类的具象,是一个实体。对于我们每个人这个个体,都是抽象概念人类的不同的实体。
例如: 你吃鱼
你:就是对象;鱼:也是对象;吃是动作
你是具体的人,是具体的对象。你属于人类,人类是个抽象的概念,是无数具体的个体的抽象。
鱼,也是具体的对象,就是你吃的这一条具体的鱼。这条鱼属于鱼类,是无数的鱼抽象出来的概念。
吃,是动作,也是操作,也是方法,这个吃是你的动作,也就是人类具有的方法。如果反过来,鱼吃人,吃就是鱼类的动作了。
4. 属性:它是对象状态的抽象,用数据结构来描述。
操作:它是对象行为的抽象,用操作名和实现该操作的方法来描述。
5. 面向对象的三要素:
封装:
组装,将数据和操作组装到一起。
隐藏数据:对外只暴露一些接口,通过接口访问对象。比如驾驶员使用汽车,不需要了解 汽车的构造细节,只需要知道使用什么部件怎么驾驶就行。
继承:
多复用:继承来的就不用自己写了
多继承少修改:OPC(Open-Closed-Principle),使用继承来改变,来体现个性
多态:
面向对象编程最灵活的地方,动态绑定。
6. Python的类:
定义:
class ClassName:
语句块
1. 必须使用class关键字
2. 类名必须是用大驼峰命名
3. 类定义完成后,就产生了一个类对象,绑定到了ClassName上
例如:
class MyClass:
"""A example class"""
x = \'abc\' # 类属性
def foo(self): # 类属性foo,也是方法
return \'My Class\'
7. 类的对象及其属性:
类对象:类的定义就会生成一个类对象
类的属性:类定义中的变量和类中定义的方法都是类的属性
类变量:x是类MyClass中的变量
MyClass中,x、foo都是类的属性,__doc__也是类的属性
foo方法是类的属性,如同吃是人类的方法,但是每一个具体的人才能吃东西,也就是说吃是人的实例才能调用的方法。
foo是method方法对象,不是普通的函数对象function了,它必须至少有一个参数,且第一个参数必须是self(self可以换个名字),这个参数位置就留给了self。
self指代当前实例本身
实例化
a = MyClass()
使用上面的语法,在类对象名称后面加一个括号,就调用类的实例化方法,完成实例化。
实例化就真正创建一个该类的对象(实例)。
实例化都获得的实例,是不同的实例,即使是使用同样的参数实例化,也督导不一样的对象。
Python类实例化后,会自动调用__init__方法。这个方法第一个参数必须留给self,其他参数随意。
8. __init__方法:
MyClass()实际上调用的是__init__(self)方法,可以不定义,如果没有定义会子啊实例化后隐式调用。
作用:对实例进行初始化
9. 实例对象instance:
类实例化后一定会获得一个对象,就是实例对象。
__init__方法的第一个参数self就是只代某一个实例。
类实例化出一个实例对象,实例对象会绑定方法。
实例变量:它时每一个实例自己的变量,时自己独有的;类变量时类的变量,是类的所以实例共享的属性和方法。
10.
特殊属性 含义
__name__ 对象名
__class__ 对象的类型
__dict__ 对象的属性的字典
__qualname__ 类的限定名
总结:
是类的,也是这个类多有实例的,其实例都可以访问到;是实例的,就是这个实例自己的,通过类访问不到。
类变量是属于类的变量,这个类的所以实例可以共享这个变量。
实例可以动态的给自己增加一个属性。实例__dict__[变量名]和实例.变量名都可以访问到。
实例的同名变量会隐藏这类变量,或者说是覆盖了这个类变量。
实例属性的查找顺序:
指的是实例使用.来访问属性,会先找自己的__dict__,如果没有,然后通过属性__class__找到自己的类,再去类的__dict__中找
注意:如果实例使用__dict__[变量名]访问变量,将不会按照上面的查找顺序找变量了。
11. 装饰一个类
回顾,什么是高阶函数?什么是装饰器函数?
思考:如何装饰一个类?
需求:为一个类通过装饰,增加一些类属性
之所以能够装饰,本质上是为类对象动态的添加了一个属性,而Person这个标识符指向这个类对象。
类方法和静态方法
前面例子中定义的__init__等方法,这些方法本身都是类的属性,第一个参数必须是self,而self必须指向一个对象,也就是类必须实例化之后,有实例来调用这个方法。
12. 类方法:
1. 在类定义中,使用@classmethod装饰器的方法
2. 必须至少有一个参数,且第一个参数留给了cls,cls指代调用者即类对象自身
3. cls这个标识符可以是任意合法名称,但是为了易读,请不要修改。
4. 通过cls可以直接操作类的属性
13. 静态方法
1.在类定义中,使用@static_method装饰器修饰的方法
2. 调用时,不会隐式的传入参数
静态方法,只是表明这个方法属于这个名词空间。函数归在一起,方便组织管理。
类几乎可以调用所以内部定义的方法,但是调用普通方法时会报错,原因时第一参数必须时类的实例。
实例也几乎可以调用所有的方法,普通的函数的调用一般不可能出现,因为不允许这么定义。
总结:
类除了普通方法都可以调用,普通方法需要对象的实例作为第一参数。
实例可以调用多有类中定义的方法(包括类方法、静态方法), 普通方法传入实例自身,静态方法和类方法需要找到实例的类。
以上是关于面向对象的主要内容,如果未能解决你的问题,请参考以下文章