面向对象

发布时间 2023-06-25 16:36:19作者: 别管鱼油我了

面向过程

面向过程就是先干什么后干什么,有顺序写,例如之前所写的ATM,就是面向过程。

优点:复杂问题简单化。缺点:扩展性比较差,其中一部分要修改,就要修改很多位置,牵一发而动全身。

对扩展性要求不高的地方可以使用面向过程。

面向对象

在生活中,对象就是“特征”和“技能”的结合体。

在过程中,对象就是属性(变量)和方法(函数和功能)的结合体。也就是功能和数据的结合体。

优点:扩展性强

缺点:复杂了

一般用于扩展性要求比较高的地方。

类的定义和对象的产生

类是对象相似“数据”与“功能”的集合体。

类体中最常见的就是“变量”和“函数”的定义,但是类体中也可包含任意其他代码。函数写在类里就叫方法。

并且需要先定义类,再调用类产生对象。(先想功能中共有的)

类体代码在定义阶段就会执行,会产生类的名称空间,调用阶段不会触发,因为在定义阶段就已经开始运行。会把类的名称空间绑定给__dict__属性,如何查看:类名.__dict__。

类的数据属性是共享给所以对象用的,大家访问的地址一样,类改值可以直接改,但是对象改类的值无法改,当对象中没有要改的值时,会自己造一个实例化,调用类。调用类:类名()。

定制对象自己独有的属性

类有一个名为 __init__() 的特殊方法(构造方法),该方法在类实例化时会自动调用。

调用类会自动触发类里的__init__方法,然后会把得到的对象本身当成第一个参数自动传递。

名字查找顺序

属性的查找顺序分两大类:

类属性:在类里面定义就是类属性

对象属性:对象自己独有的属性

class Student():
    school = 'sh'

    def __init__(self,name,age):
        self.name = name
        self.age = age


# print(Student.__dict__)
stu = Student('lin','18')
print(stu.__dict__)  #{'name': 'lin', 'age': '18'}

# #类查看
# print(Student.school)  #sh
# #类增加
# Student.salsry = 20000
# print(Student.__dict__)
# #类修改
# Student.salsry = 28000
# print(Student.__dict__)
# #类删除
# del Student.salsry
# print(Student.__dict__)

#对象查看
print(stu.age)  #18
print(stu.name)   #lin
print(stu.school)   #sh   (这个比较特殊,当对象中没有时就会从类中找)
#对象增加
stu.salary = 20000
print(stu.__dict__)  #'name': 'lin', 'age': '18', 'salary': 20000}
#对象修改
stu.salary = 28000
print(stu.__dict__)  #{'name': 'lin', 'age': '18', 'salary': 28000}
#对象删除
del stu.salary
print(stu.__dict__)  #{'name': 'lin', 'age': '18'}

练习题

# 定义两个英雄类:
# 每个英雄初始化的数据有:昵称、生命值、法力、攻击力()
# 定义一个计数器,记录产生了多少个对象
class Heros():
    count = 0

    def __init__(self, name, HP, power, attack):
        self.name = name
        self.HP = HP
        self.power = power
        self.attack = attack
        Heros.count += 1

hero = Heros('angle','10000','1000','2000')
hero1 = Heros('di','20000','1000','5000')
print(hero.__dict__)
print(hero1.__dict__)
print(hero.count)