1.python-面向对象

1. 概述

1.1 面向过程

定义:分析出解决问题的步骤,然后逐步实现。
例如:婚礼筹办
-- 请柬(选照片、措词、制作)
-- 宴席(场地、找厨师、准备桌椅餐具、计划菜品、购买食材)
-- 仪式(定婚礼仪式流程、请主持人)

 

1.2 面向对象 

定义:找出解决问题的人,然后分配职责。
例如:婚礼筹办
-- 发请柬:找摄影公司(拍照片、制作请柬)
-- 宴席:找酒店(告诉对方标准、数量、挑选菜品)
-- 婚礼仪式:找婚庆公司(对方提供司仪、制定流程、提供设备、帮助执行)

2 类和对象

2.1 抽象

(1) 从客观事物中抽离出共性、本质,舍弃个别、非本质的过程。
(2) 类:抽象的概念,即生活中的"类别"。
--数据:车牌号、颜色、品牌...
--行为:计费
(2) 对象:具体的实例,即归属于某个类别的"个体"。
--数据:京C007、白色、奔驰

2.2 语法

2.2.1 定义类

class Taxi:  # 类的所有首字母大写
    def __init__(self, color="", speed=""):  # __init__方法也叫构造函数,创建对象时调用,可以省略
        # self变量绑定的是被创建的对象,可指定任意名字
        self.color = color
        self.speed = speed

    def charging(self):
        print("计费中")

2.2.2 实例化对象

# 实例化对象(具体化) 自动调用__init__
# 语法:对象名 = 类名(数据)
# 对象名存储的是实例化后的对象地址
bc = Taxi("白色", "100码")  # 类名后面的参数按照构造函数的形参传递
# color与speed称为实例变量
print(bc.color)  # 白色
print(bc.speed)  # 100吗
bc.charging()

# python内置实例变量(自定义对象可以使用)
# {实例变量名:实例变量值}
print(bc.__dict__)
# {'color': '白色', 'speed': '100码'}

bm = Taxi("黑色", "200码")
print(bm.color)
bm.charging()

 

2.2.3 静态方法

# 静态方法
# (1) 定义:@staticmethod
# (2) 调用:类名.方法名称(参数)
# (3) 说明
# -- 使用@staticmethod修饰的目的是该方法不需要隐式传参数。
# -- 静态方法不能访问实例成员
# (4) 作用:定义常用的工具函数。
class Taxi:  # 类的所有首字母大写
    def __init__(self, color="", speed=""):  # __init__方法也叫构造函数,创建对象时调用,可以省略
        # self变量绑定的是被创建的对象,可指定任意名字
        self.color = color
        self.speed = speed

    def charging(self):
        print("计费中")

    @staticmethod  # 定义静态方法
    def carry_passenger(num):
        print("这趟运了%s位乘客" % num)


Taxi.carry_passenger(3)  # 调用静态方法

3 继承

3.1 定义

(1) 概念: 重用现有类的功能,并在此基础上进行扩展。
(2) 说明:子类直接具有父类的成员(共性),还可以扩展新功能。
(3) 相关知识
-- 父类(基类、超类)、子类(派生类)。
-- 父类相对于子类更抽象,范围更宽泛;子类相对于父类更具体,范围更狭小。

--单继承: 父类只有一个(例如Java, C#)

--多继承: 父类有多个(例如C++, Python)

3.2 继承方法

class People:
    def __init__(self, name="", sex="", age=""):
        self.name = name
        self.sex = sex
        self.age = age

    def study(self):
        print("学无止境")

    def speak(self):
        print("理解与沟通")


class Student(People):  # 继承People类,python中可以有多个父类
    def study(self):  # 重写父类的方法study
        # super().study() # 在子类的方法中可以通过超类super()调用父类的方法
        print("学习是学生的天职")


tom = Student()
tom.study()  # 当父类和子类都有相同的方法时,子类调用自己的方法
tom.speak()  # 继承自父类People的方法,可以直接调用 打印理解与沟通

3.3 继承数据

class People:
    def __init__(self, name="", sex="", age=""):
        self.name = name
        self.sex = sex
        self.age = age

    def study(self):
        print("学无止境")

    def speak(self):
        print("理解与沟通")


class Student(People):  # 继承People类,python中可以有多个父类
    def study(self):  # 重写父类的方法study
        # super().study() # 在子类的方法中可以通过超类super()调用父类的方法
        print("学习是学生的天职")


# 子类没有构造函数,将执行继承自父类的构造函数
tom = Student("汤姆", "", "18")
print(tom.name)  # 汤姆
print(tom.sex)  #
print(tom.age)  # 18


class Teacher(People):  # 继承People类,python中可以有多个父类
    def __init__(self, position="", wages=0):
        self.position = position
        self.wages = wages


# 子类有构造函数时,将执行自己的构造函数
ross = Teacher("班主任", 5000)
print(ross.position)  # 班主任
print(ross.wages)  # 5000


class Principal(People):  # 继承People类,python中可以有多个父类
    def __init__(self, name="", sex="", age="", working_years=0):
        super().__init__(name, sex, age)  # 通过超类super()调用父类的构造函数__init__确保继承自父类实例变量能正确被创建
        self.working_years = working_years


# 子类有构造函数,
bob = Principal("鲍勃", "", "51", 30)
print(bob.name)
print(bob.sex)
print(bob.age)
print(bob.working_years)

内存图

程序自上而下运行,将class Taxi加载到代码区

实例化类Taxi对象,会运行类的构造方法__init__,传入"白色","京c007","奔驰",color保存"白色"地址值,license保存"京c007"地址值,brand保存"奔驰"地址值

程序向下运行self保存的是实例对象的地址值

将color赋值给self.color,self.color存储的是"白色"的地址值

将license赋值给self.license,self.license存储的是"京c007"的地址值

将brand赋值给self.brand,self.brand存储的是"奔驰"的地址值

最后将self赋值给bc,bc存储的是实例对象的地址值,构造函数运行结束,在内存中被释放

bc调用实例方法start,self存储的是实例对象的地址值,方法运行结束,在内存中被释放

程序自上而下运行,将class Taxi加载到代码区

实例化类Taxi对象,会运行类的构造方法__init__,传入"白色","奔驰",color保存"白色"地址值,brand保存"奔驰"地址值

程序向下运行self保存的是实例对象的地址值

将color赋值给self.color,self.color存储的是"白色"的地址值

将brand赋值给self.brand,self.brand存储的是"奔驰"的地址值

最后将self赋值给bc,bc存储的是实例对象的地址值,构造函数运行结束,在内存中被释放

将bc赋值给bm,bm存储的是实例对象的地址值

将"宝马"赋值给bm.brand,则实例对象属性brand存储的是"宝马"的地址值

 

 

程序自上而下运行,将class Taxi加载到代码区

实例化类Taxi对象,会运行类的构造方法__init__,传入"白色","奔驰",color保存"白色"地址值,brand保存"奔驰"地址值

程序向下运行self保存的是实例对象的地址值

将color赋值给self.color,self.color存储的是"白色"的地址值

将brand赋值给self.brand,self.brand存储的是"奔驰"的地址值

最后将self赋值给bc,bc存储的是实例对象的地址值,构造函数运行结束,在内存中被释放

同上bm存储的是实例对象(宝马)的地址值

运行函数func01,传入bc和bm,p1存储实例对象(奔驰)地址值,p2存储实例对象(宝马)地址值

将"银色"和"奔驰C260"分别赋值给p1.color和p2.brand,则实例属性color存储的是"银色"地址值,实例属性brand存储的是"奔驰C260"地址值

将Taxi("银色","宝马3系")赋值给p2,p2存储的是实例对象(宝马3系)的地址值,func01运行结束,在内存中被释放

bc存储的实例对象属性被改变,bm存储的实例对象属性未改变

 

 

 

 

 

 

 

 

 

 

 

posted @ 2022-12-14 23:25  跃动指尖  阅读(42)  评论(0)    收藏  举报