一. 类和实例
面向对象最重要的概念就是类(class)和实例(instance),类是抽象的模板,比如学生这个抽象的事物,可以用一个Student类来表示。而实例是根据类创建出来的一个个具体的“对象”,每一个对象都从类中继承有相同的方法,但各自的数据可能不同。
类的结构在大的方向上分为两部分
- 静态变量
- 动态方法
对象是从类中出来的,只要是类名加上(),这就是实例化的过程,就会实例化一个对象。
实例化的过程
- 在内存中开辟一个对象空间
- 自动执行类中的__init__方法,并将这个对象空间(内存地址)传给__init__()
- 方法的第一个位置参数self 在__init__方法中通过 self 给对象空间添加属性
类的定义和调用
class Chinese(object): ##(Object)表示该类从哪个类继承下来的,Object类是所有类都会继承的类。
color = "yellow" # 这里定义一个数据属性
def make_money(): # 定义函数属性
print("Can make money...")
def impolite(self):
print("Do something is impolite")
print(Chinese.color) # 这种加上 . 的调用形式,本质上就是在属性字典中调用
Chinese.make_money()
print(dir(Chinese)) # 查看所有的变量(列表的形式)
print(Chinese.__dict__) # 查看属性字典(包含数据属性和函数属性)
print(Chinese.__dict__["color"])
Chinese.__dict__["make_money"]() # 这样就相当于直接去调用make_money函数
Chinese.__dict__["impolite"](Chinese) # 这样调用impolite函数,因为这个函数中接受一个self参数,所以要将Chinese传入
print(Chinese.__name__) # 显示类名
print(Chinese.__doc__) # 类中的文档
print(Chinese.__module__) # 显示类所在的模块
二. 普通方法
- 和普通数相比,在类中定义函数只有一点不同,就是第一参数永远是类的本身实例变量self,并且调用时,不用传递该参数。除此之外,类的方法(函数)和普通函数没啥区别
- self代表类的实例,而非类
- 在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self, 且为第一个参数,self 代表的是类的实例。
对于属性的查找规则
- 对象查找属性的顺序:对象空间栈 ——> 类空间栈 ——> 父类空间栈
- 类名查找属性的顺序:本类空间栈 ——> 父类空间栈 ——> …
初始化方法:
类名() 就可以创建一个对象 类名() 创建对象的时候,python解释器会自动执行以下操作
- 为对象在内存中分配空间–创建对象
- 调用初始化方法为对象的属性设置初始值 这个初始化方法是内置方法,是专门用来定义一个类据有哪些属性和方法的
定义一个类
class Person:
name = '张三'
def __init__(self, name, age): #这里涉及初始化方法,会在魔术方法部分详述
self.name = name
self.age = age
def eat(self, food):
print('{}正在吃{} !。。。'.format(self.name, food))
def run(self):
print('{},今年}岁,正在跑步'.format(self.name, self.age))
进行调用
p = Preson()
print(p)
使用 类名() 创建对象,创建对象 的动作有两步:
- 在内存中为对象 分配空间
- 调用初始化方法 init 为 对象初始化
- 创建出来的 对象 叫做 类 的 实例
- 创建对象的 动作 叫做 实例化
- 对象的属性 叫做 实例属性
- 对象调用的方法 叫做 实例方法
每一个对象 都有自己 独立的内存空间,保存各自不同的属性
多个对象的方法,在内存中只有一份,在调用方法时,需要把对象的引用 传递到方法内部
类属性的增删改查