Python基础:面向对象
一、理解面向对象
面向对象:对整个代码逻辑(包含数据、函数、逻辑)进行包装(专业术语:封装),最大程度提升代码复用,减少编码量
二、类和对象
2.1 理解类和对象
类:类是对一系列具有相同特征和行为的实物的统称,是一个抽象的概念,不是真实存在的事物。特征即是属性,行为即是方法。
对象:对象是由类创造出来的一个具体存在的,可以直接使用的。由哪一个类创建出来的对象,就拥有在哪一个类中定义的属性和方法。
在程序开发中,应该先有类,再有对象。
2.2 类和对象的关系
类是模板,对象是根据类这个模板创建出来的,应该先有类,再有对象。类只有一个,而对象可以有很多个,不同对象之间属性可能会各不相同。
2.3 类的设计
在使用面向对象开发前,应该首先分析需求,确定一下,程序中需要包含哪些类。
通过需要设计一个类,需要满足以下三个要素:
- 类的名称,这个事物的名字,满足大驼峰命名法
- 类的属性:这类事物具有什么样的特征
- 类的方法:这类事物具有什么样的行为
2.4 面向对象实现方法
class 类名(): # 注意:类名要满足标识符命名规则,同时遵循大驼峰命名习惯 代码
class Plane(): def fly(self): print('我会飞')
2.4.1 创建对象
对象也叫实例,创建对象的过程叫实例化。
语法:对象名 = 类名()
#创建对象 plane1 = Plane() print(plane1) plane1.fly()
2.4.2 self
self指的是调用该函数的对象
# 1.定义一个类 class plane(): def fly(self): print('我会飞') print(self) #2 实例化两个对象 plane1 = plane() print(plane1) plane2 = plane() print(plane2) # 3.调用实例方法 plane1.fly() plane2.fly()
注意:打印对象和self得到的结果是一致的,都是当前内存中存储的地址
2.4.3 魔法方法
在python中, __xx__() 的函数叫做魔法方法,指的是具有特殊功能的函数
__init__:对象被初始化时,会被自动调用,专门定义一个对象具有哪些属性的方法(重点,不需要掌握)
__str__:返回对象的描述信息,print函数输出使用,不加 __str__ 正常返回对象指向的内存地址。该方法在print(对象)时,会被自动调用。当针对对象做str类型转换时,也会自动调用。
def __str__(self): return f'{self.name},{self.age},{self.grade},{self.score}'
这里返回的必须是str类型,用其他类型会报错。
三、添加和获取对象属性
属性即是特征,比如:飞机的长,宽,重量:
对象属性既可以在类外面添加和获取,也能在类里面添加和获取。
3.1 类外面添加对象属性
语法
对象名.属性名 = 值
示例:
plane1.lenth = 400
plane1.weight = 500
3.2 类外面获取对象属性
语法
对象名.属性名
示例:
print(plane1.weight) print(plane1.lenth)
3.3 类里面获取对象属性
self.属性名
四、类属性和实例属性
4.1 类属性
类属性的优点
- 类的实例,记录的某项数据 始终保持一致时,则定义类属性。
- 实例属性 要求每个对象为其单独开辟一份内存空间 来记录数据,而类属性为全类所共有,仅占用一份内存,更加节省内存空间。
4.1.1 设置和访问类属性
- 类属性就是类对象所拥有的属性,它被该类的所有实例对象所共有
- 类属性可以使用类对象或实例对象访问
class Dog(object): tooth = 10 wangcai =Dog() xiaohei = Dog() print(Dog.tooth) # 10 print(wangcai.tooth) #10 print(xiaohei.tooth) # 10
4.1.2 修改类属性
类属性只能通过类对象修改,不能通过实例对象修改。
如果通过实例对象修改类属性,表示的是创建了一个实例属性。
class Dog(object): tooth = 10 wangcai = Dog() xiaohei = Dog() # 修改类属性 Dog.tooth = 20 print(Dog.tooth) # 20 print(wangcai.tooth) #20 print(xiaohei.tooth) # 20 # 修改实例属性 wangcai.tooth = 30 print(wangcai.tooth) #给实例对象增加一个实例属性 30 print(Dog.tooth) # 20 print(xiaohei.tooth) # 20
4.2 实例属性
实例属性不能通过类去访问。
class Dog(object): def __init__(self): self.age= 5 def info_print(self): print(self.age) wangcai = Dog() print(wangcai.age) # print(Dog.age) #报错,实例属性不能通过类去访问 wangcai.info_print() # 5
五、类方法和静态方法
5.1 类方法
5.1.1 类方法特点
- 第一个形参是类对象的方法
- 需要用装饰器 @classmethod 来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls 作为第一个参数。cls表示当前类。
- 注意:类方法无法直接使用self去调用对象属性和对象方法
5.1.2 类方法使用场景
- 当方法中 需要使用类对象(如访问私有属性等)时,定义类方法
- 类方法一般和类属性配合使用
class Student(): school = '郑梁梅'
@classmethod def show_school(cls): print(f'学校是{cls.school}')
student1 = Student()
result = student1.show_school #实例对象访问类方法Student.show_school # 类对象访问类方法
5.2 静态方法
5.2.1 静态方法特点
- 需要通过装饰器 @staticmethod 来进行修饰,静态方法既不需要传递类对象也不需要传递实例对象(形参没有 self 或者 cls )
- 静态方法 也能通过实例对象和类对象去访问
5.2.2 静态方法使用场景
- 当方法中 既不需要使用实例对象(如实例对象,实例属性),也不需要使用类对象(如类属性,类方法,创建实例对象等)时,定义 静态方法
- 取消不需要的参数传递,有利于减少不必要的内存占用和性能消耗
- 仅仅是为了按照一定规则分类,把这个函数放在了类下面进行管理
class Dog(object): @staticmethod def info_print(): print('这是一个狗类,用于创建狗的实例......') wangcai = Dog() #静态方法既可以使用对象访问又可以使用类访问 wangcai.info_print() Dog.info_print()
六、继承
Python面向对象继承指的是多个类之间的所属关系,即子类默认继承父类的所有属性的方法。
#父类A class A(object): def __init__(self): self.money = "qq密码" def qq_info(self): print(self.money) #子类B class B(A): pass son = B() son.info_print()
在Python中,所有类默认继承object类,object类是顶级类或基类;其他子类叫做派生类。