Day10/2------类:实例的变量和方法,类的实例和方法

面向对象 Object Oriented

面向过程
1. 分析出解决问题的步骤,然后逐步实现。
例如:婚礼筹办
– 发请柬(选照片、措词、制作)
– 宴席(场地、找厨师、准备桌椅餐具、计划菜品、购买食材)
– 婚礼仪式(定婚礼仪式流程、请主持人)
2. 公式:程序 = 算法 + 数据结构
3. 优点:所有环节、细节自己掌控。
4. 缺点:考虑所有细节,工作量大。
面向对象
1. 找出解决问题的人,然后分配职责。
例如:婚礼筹办
– 发请柬:找摄影公司(拍照片、制作请柬)
– 宴席:找酒店(告诉对方标准、数量、挑选菜品)
– 婚礼仪式:找婚庆公司(对方提供司仪、制定流程、提供设备、执行)
2. 公式:程序 = 对象 + 交互
3. 优点
(1) 思想层面:
– 可模拟现实情景,更接近于人类思维。
– 有利于梳理归纳、分析解决问题。
(2) 技术层面:
– 高复用:对重复的代码进行封装,提高开发效率。
– 高扩展:增加新的功能,不修改以前的代码。
– 高维护:代码可读性好,逻辑清晰,结构规整。
4. 缺点:学习曲线陡峭。

类和对象

1. 类:一个**抽象**的概念,即生活中的”类别”。
2. 对象:类的**具体**实例,即归属于某个类别的”个体”。
3. 类是创建对象的”模板”。

– 数据成员:名词类型的状态。
– 方法成员:动词类型的行为。
4. 类与类行为不同,对象与对象数据不同。

语法

定义类

1. 代码

class 类名:
“”“文档说明”""
def init(self,参数列表):
self.实例变量 = 参数

"""
    练习:创建狗类
            数据:  爱称,品种,价格
            行为:  叫
        创建2个狗对象,分别调用叫的行为
"""
class Dog:
    def __init__(self, pet_name = "", breed = "", price=3000):#初始化
        self.pet_name = pet_name
        self.breed = breed
        self.price = price

    def shout(self):#方法
        print(self.pet_name, "旺旺叫")

# 2对象  2套数据
d01 = Dog("米咻","拉不拉多")
d02 = Dog("黑米","拉不拉多",3500)
# 1个方法被多个对象共享
d01.shout()
d02.shout()

2. 说明

– 类名所有单词首字母大写
init 也叫构造函数,创建对象时被调用,也可以省略。
– self 变量绑定的是被创建的对象,名称可以随意。

创建对象(实例化)

变量 = 构造函数 (参数列表)

实例成员

1. 实例变量

1. 语法
(1) 定义:对象.变量名
(2) 调用:对象.变量名 

2. 说明
(1) 首次通过对象赋值为创建,再次赋值为修改.

w01 = Wife()
w01.name = “丽丽”
w01.name = “莉莉”
(2) 通常在构造函数(init)中创建。
w01 = Wife(“丽丽”,24)
print(w01.name)
(3) 每个对象存储一份,通过对象地址访问。

3. 作用:描述某个对象的数据。
4. __dict__:对象的属性,用于存储自身实例变量的字典。

2. 实例方法

1. 语法

(1) 定义: def 方法名称(self, 参数列表):
方法体
(2) 调用: 对象地址.实例方法名(参数列表)
不建议通过类名访问实例方法
2. 说明
(1) 至少有一个形参,第一个参数绑定调用这个方法的对象,一般命名为"self"。
(2) 无论创建多少对象,方法只有一份,并且被所有对象共享。
3. 作用:表示对象行为。

"""
        在终端中循环录入学生信息(名字,年龄,性别,成绩),
        如果名字为空,结束录入,打印所有人的信息.
        -- 创建学生类
        -- 打印个人信息的行为
"""
class Student:
    def __init__(self, name, age, sex, score):
        self.name = name
        self.age = age
        self.sex = sex
        self.score = score

    def print_self(self):
        print("我叫%s,今年%d岁了,性别%s,成绩是%d." % (self.name, self.age, self.sex, self.score))
        
list_studnet = []
while True:
    name = input("请输入姓名:")
    if name == "":
        break
    age = int(input("请输入年龄:"))
    sex = input("请输入性别:")
    score = float(input("请输入成绩:"))
    stu = Student(name, age, sex, score)
    list_studnet.append(stu)

for item in list_studnet:
    item.print_self()

类成员

1. 类变量

1. 语法
(1) 定义:在**类中**,**方法外**定义变量。

class 类名:
变量名 = 表达式
(2) 调用:类名.变量名
不建议通过对象访问类变量
2. 说明
(1) 存储在类中。
(2) 只有一份,被所有对象共享。
3. 作用:描述所有对象的共有数据。

2. 类方法

1. 语法
(1) 定义:
@classmethod
def 方法名称(cls,参数列表):
     方法体
(2) 调用:类名.方法名(参数列表) 
  不建议通过对象访问类方法
2. 说明

(1) 至少有一个形参,第一个形参用于绑定类,一般命名为’cls’
(2) 使用@classmethod修饰的目的是调用类方法时可以隐式传递类。
(3) 类方法中不能访问实例成员,实例方法中可以访问类成员。
3. 作用:操作类变量。

"""
    对象计数器
    创建老婆类,记录老婆对象的数量.
"""
class Wife:
    count = 0		#定义类变量

    @classmethod
    def print_count(cls):
        print("我已经娶了%d个老婆了"%cls.count)

    def __init__(self, name):
        self.name = name
        Wife.count += 1

w01 = Wife("锤锤")
w02 = Wife("方方")
w03 = Wife("圆圆")
Wife.print_count()	#调用类方法

最后,附上一个经典练习:

多多练习定义实例方法,调用实例变量,进行各种操作

class Student:
    """
        学生
    """

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

    def print_self(self):
        print("我叫%s,今年%d岁了,性别%s,成绩是%d." % (self.name, self.age, self.sex, self.score))


# 学生列表
list_student = [
    Student("悟空", 27, "男", 100),
    Student("八戒", 30, "男", 60),
    Student("沙僧", 33, "男", 70),
    Student("唐僧", 20, "女", 65),
]

# 1. 定义函数,在学生列表中查找姓名是八戒的学生对象
#    测试,将对象的信息打印在终端中
def find01():
    for item in list_student:
        if item.name == "八戒2":
            return item

stu = find01()		#定义变量接收返回值
if stu:		#判断是否为空,再进行打印
    stu.print_self()  # None.print_self()

# 2. 定义函数,在学生列表中查找成绩大于60分的所有学生对象
#    测试,将所有对象的信息打印在终端中
def find02():
    list_result = []
    for item in list_student:
        if item.score > 60:
            list_result.append(item)
    return list_result

find02()
for item in find02():
    item.print_self()

# 3. 定义函数,在学生列表中查找成所有年龄大于30的学生姓名
#    测试,将所有姓名打印在终端中
def find03():
    list_name = []
    for item in list_student:
        if item.age > 30:
            list_name.append(item.name)
    return list_name

find03()
for item in find03():
    print(item)


# 4. 定义函数,在学生列表中查找成绩最低的学生对象
#    测试,将该学生信息打印在终端中
def find04():
    min_stu = list_student[0]
    for i in range(1, len(list_student)):
        if min_stu.score > list_student[i].score:		#逐个比较,若小则换
            min_stu = list_student[i]
    return min_stu

re = find04()
re.print_self()

# 5. 根据年龄,按照升序将学生列表进行排列.
def sort():
    for r in range(len(list_student) - 1):
        for c in range(r + 1, len(list_student)):
            if list_student[r].age > list_student[c].age:
                list_student[r], list_student[c] = list_student[c], list_student[r]

sort()
for item in list_student:
    item.print_self()

# 6. 将学生列表中所有男同学删除.
def delete_all():
    for i in range(len(list_student) - 1, -1, -1):
        if list_student[i].sex == "男":
            del list_student[i]

delete_all()
for item in list_student:
    item.print_self()

你可能感兴趣的:(第一阶段)