day14-类和对象


一、面向对象编程

1.编程思想

  • 面向过程编程 ---> 算法,逻辑(数学逻辑)
n = 100
sum1 = 0
for x in range(n+1):
    sum1 += x
  • 函数式编程 ---> 函数,模块
def add_student():
    pass
  • 面向对象编程 ---> 类和对象 (生活)
class Student_Manager:
    def add_student(self):
        pass

二、类和对象的声明

1.类和对象定义:

  • 类 - 是拥有相同属性和相同功能的对象的集合(抽象的)

  • 对象 - 就是类的实例(具体的)

2.类的声明

  • 类的内容包含属性和方法, 方法分为对象方法、类方法和静态方法

  • 字面量:

class 类名(父类列表):
    类的说明文档
    类的内容
  • 说明:
    • class -> python中声明类的关键字

    • 类名 -> 标识符,不能是关键字;类名使用驼峰式命名,并且首字母大写;见名知义

    • (父类列表) -> 继承语法,让声明的类继承括号中的父类。这个结构可以省略,让当前类继承python的基类:object

    • : -> 固定结构

    • 类的说明文档 -> 注释,对类进行说明。

    • 类的内容 -> 包含属性(变量)和方法(函数)

    • 附:

      • 驼峰式命名-->如果一个名字由多个单词组成,第一个单词首字母小写,后面每个单词首字母大写,如:userName

      • PEP8命名规范-->如果一个名字由多个单词组成,所有字母小写,多个单词之间用下划线隔开,如:user_name

  • 例子:
# 声明Person类,吃饭和睡觉
class Person:
    """人类"""

    def eat(self):
        print('吃饭!')

    def sleep(self):
        print('睡觉!')

3.对象的声明

  • 格式:
对象名 = 类名()
  • 说明:
    • 对象名 -> 变量名

    • 类名 -> 必须是声明过的类

  • 例子:
class Person:
    """人类"""

    def eat(self):
        print('吃饭!')

    def sleep(self):
        print('睡觉!')
p1 = Person()
p2 = Person()

三、对象方法

1.定义

  • 对象方法:直接声明在类中的函数就是对象方法。对象方法都有一个默认参数self, 通过对象来调用

2.调用过程

  • 对象方法的调用: 对象.方法名()。调用对象方法的时候,不需要给默认参数self传参。系统会自动将当前对象传递给self 。

3.self

  • 定义:
    self: 谁调用当前的对象方法,self就指向谁。self就是当前类的对象,类的对象能做的事情,self都能做

4.应用

# 声明类
class Person:
    """人类"""

    # 对象方法eat
    def eat(self, name):
        # self = p1, name = '小明'
        print('self:',self)
        print('吃饭!')
        self.sleep()

    def sleep(self):
        print('s_self', self)
        print('睡觉')



# 声明对象
p1 = Person()
print('p1:', p1)
p1.eat('小明')
# p1.sleep()

p2 = Person()
print('p2:', p2)
p2.eat('小红')


四、构造方法和init方法

1.构造方法

  • 定义:
    构造方法就是函数名和类名一样的方法,作用是用来创建对象的。声明类的时候,系统会自动为这个类创建对应构造方法

  • 创建对象的过程:
    调用构造方法在内存中开辟空间创建对象,并且会自动调用init方法去对这个对象进行初始化,最后将创建好的对象的地址返回

2.__init__方法

  • 定义:对象方法,不需要手动调用,创建完对象后,会被自动调用
  • 例子:
class Dog:
    """🐶类"""
    def __init__(self):
        print(self)
        print('init方法')


dog1 = Dog()
print(dog1)

dog2 = Dog()

3.带参其他参数的__init__方法

  • __init__方法的参数要通过构造方法来传。(构造方法的实参,会传递给init方法的形参)

  • 例子:

class Person:
    def __init__(self, name='', age=0):
        print(name, age)


p1 = Person('小红', 20)
p2 = Person('小明')
p3 = Person(age=10)

五、类的属性

1.基本知识

  • 类的内容包含属性和方法,属性又分为对象属性和类的字段

  • 属性:用来在类中去保存数据的变量。

2.对象属性

  • 定义:
    属性的值会因为对象不同而不同,这种属性就需要声明成对象属性,例如:人的名字,人的年龄等,对象属性要通过对象来使用

  • 声明方法:

    • a.必须声明在__init__方法中

    • b.声明格式:self.属性 = 初值

  • 使用方法:
    使用对象属性: 对象.属性
    *例子:

class Person:
    def __init__(self):
        self.name = '张三'
        self.age = 18
        self.sex = '男'



p1 = Person()
print(p1.name)

p2 = Person()
print(p2.name)
  • 附:创建对象的时候可以给对象属性赋值
class Person2:
    def __init__(self, name1, age1=0, sex1='girl'):
        self.name = name1
        self.age = age1
        self.sex = sex1
        self.id = '0001'


p1 = Person2('小明', 30, '女')

3.对象属性的增删改查

  • 增和改

    • 方法1:对象.属性 = 值,(属性不存在的时候增加,存在的是就是修改)

    • 方法2:setattr(对象,属性名,属性值),(属性不存在的时候增加,存在的是就是修改)

    • 方法3:对象.__setattr__(属性名,属性值),(属性不存在的时候增加,存在的是就是修改)

    • 注意:给对象添加属性,只能添加到当前对象中。不会影响当前类的其他对象

    • 方法一:del 对象.属性

    • 方法二:delattr(对象, 属性名)

    • 方法三: 对象.delattr(属性名)

    • 注意:删除只删除当前对象的属性,对当前类的其他对象没有影响

    • 方法1:对象.属性 --> 获取指定属性值,属性不存在会报错

    • 方法2:getattr(对象, 属性名, 默认值) -> 获取指定属性值,如果设置了默认值当属性不存在的时候不会报错,并且会将默认值作为结果。(如果没有设置默认值,属性不存在还是会报错)

    • 方法3:对象.__getattribute__(属性名) -> 获取指定属性值.属性不存在会报错

  • 例子:

class Student:
    def __init__(self, name1='', age1=0, study_id1='001'):
        self.name = name1
        self.age = age1
        self.study_id = study_id1


stu1 = Student('小明')
stu2 = Student('小红', 18)
# 1.查

print(stu1.name)
# print(stu1.name2)   # AttributeError: 'Student' object has no attribute 'name2'


print(getattr(stu1, 'name'))
print(getattr(stu1, 'name2', '张三'))


print(stu1.__getattribute__('study_id'))
# print(stu1.__getattribute__('study_id2')) # AttributeError: 'Student' object has no attribute 'study_id2'

# 2.增/改

# 添加
stu1.sex = '男'
print(stu1.sex)

# 修改
stu1.name = '李四'
print(stu1.name)

# 修改
setattr(stu1, 'name', '娜美')
print(stu1.name)

# 添加
setattr(stu1, 'name2', '宝儿姐')
print(stu1.name2)

# 3.删

del stu1.age
# print(stu1.age)

print(stu1.sex)
delattr(stu1, 'sex')
# print(stu1.sex)

stu1.__delattr__('name')

4.类的字段

  • 定义:声明在类里面,函数外面的变量就是类的字段。使用的时候要通过类来使用:类.字段

  • __slots__: 用来约束当前类的对象的属性有哪些

  • 例子:

class Dog:
    # num就是类的字段
    num = 10

    __slots__ = ('color', 'name', 'type', 'sex', 'price', 'age')

    def __init__(self, color, name, type):
        self.color = color
        self.name = name
        self.type = type
        self.sex = '公的'
        print(Dog.num)


Dog.num = 100
print(Dog.num)

dog1 = Dog('黄色', '大黄', '土狗')

# dog1.neme = '财财'
# print(dog1.name)
dog1.age = 3

六、内置类属性

用法 作用
类.__name__ 获取当前类的名字
类.__doc__ 获取类的说明文档
对象.__class__ 获取对象的类, 类能做的事情,他都可以做
类.__dict__ 获取当前类的所有类的字段和其对应的值,以字典的形式返回(了解)
对象.__dict__ 获取当前对象所有的属性和其对应的值,以字典的形式返回
类.__module__ 获取当前类所在的模块名
类.__bases__ 获取当前类的父类, 返回的是一个元祖,元祖的元素是类

作业

1. 声明一个电脑类

1. 声明一个电脑类
class Computer:
    def __init__(self, brand, colour, memory_size):
        self.brand = brand
        self.colour = colour
        self.memory_size = memory_size
    def play_games(self):
        print('打游戏')
    def write_code(self):
        print('写代码')
    def watch_videos(self):
        print('看视频')


computer1 = Computer('联想', 'black', '8G')
# 1.查
print(computer1.brand)
print(getattr(computer1, 'colour'))
# 2.改
computer1.brand = '华为'
print(computer1.brand)
setattr(computer1, 'brand', '苹果')
print(computer1.brand)
# 3.增
computer1.price = 10000
print(computer1.price)
setattr(computer1, 'system', 'windows')
print(computer1.system)
# 4.删
del computer1.price
# print(computer1.price)  AttributeError: 'Computer' object has no attribute 'price'
delattr(computer1, 'system')
# print(computer1.system)  AttributeError: 'Computer' object has no attribute 'system'

#联想
#black
#华为
#苹果
#10000
#windows

2.声明一个人的类和狗的类

class Dog:
    def __init__(self, name, age, colour):
        self.name = name
        self.age = age
        self.colour = colour
    def cry(self):
        print('汪汪汪')


dog1 = Dog('小黄', 5, '黄色')


class Person:
    def __init__(self, name, age, dog):
        self.name = name
        self.age = age
        self.dog = dog
    def walk_the_dog(self, dog_name):
        print('我去遛%s了'%(dog_name))


person1 = Person('小明', 18, dog1)
person1.walk_the_dog(person1.dog.name)
#我去遛小黄了

3.声明一个矩形类

class Rectangle:
    def __init__(self, long, width):
        self.long = long
        self.width = width
    def show_perimeter(self):
        return 2*(int(self.long)+int(self.width))
    def show_area(self):
        return int(self.long)*int(self.width)


rectangle1 = Rectangle(2, 3)
print(rectangle1.show_area())
print(rectangle1.show_perimeter())
#6
#10

4.创建一个学生类和班级类

class Student:
    def __init__(self, name, age, study_id, score):
        self.name = name
        self.age = age
        self.study_id = study_id
        self.score = score
    def reply(self):
        print('到')
    def show_student_info(self):
        return 'name: '+self.name+' age: '+self.age+' study_id: '+self.study_id


student1 = Student('小明', '18', '001', '90')
student2 = Student('小绿', '18', '002', '65')
student3 = Student('小花', '17', '003', '70')
student4 = Student('小红', '19', '004', '85')
students = [student1, student2, student3]


class My_class:
    def __init__(self, stu, stu_class):
        self.stu = stu
        self.stu_class = stu_class
    def add_student(self, stu):
        students.append(stu)
    def del_student(self, stu):
        students.remove(stu)
    def call_the_roll(self,stu_name):
        print('来了吗%s'%(stu_name))

    def my_max(self):
        score_max = self.stu[0].score
        the_name = self.stu[0].name
        for stu in self.stu:
            if stu.score > score_max:
                score_max = stu.score
                name = the_name
        print(the_name, score_max)

    def get_average_value(self):
        score_sum = 0
        for stu in self.stu:
            score_sum += int(stu.score)
        stu_number = int(len(self.stu))
        score_average_value = score_sum/stu_number
        return score_average_value


my_class1 = My_class(students, 'class01')
my_class1.add_student(student4)
for student in students:
    print(student.show_student_info())
print('===================')
my_class1.del_student(student4)
for student in students:
    print(student.show_student_info())
name1 = input('请输入要点名的人: ')
my_class1.call_the_roll(name1)
for student in students:
    if student.name == name1:
        student.reply()
my_class1.my_max()
print(my_class1.get_average_value())

#name: 小明 age: 18 study_id: 001
#name: 小绿 age: 18 study_id: 002
#name: 小花 age: 17 study_id: 003
#name: 小红 age: 19 study_id: 004
#===================
#name: 小明 age: 18 study_id: 001
#name: 小绿 age: 18 study_id: 002
#name: 小花 age: 17 study_id: 003
#请输入要点名的人: 小明
#来了吗小明
#到
#小明 90
#75.0
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

  • 一、面向对象编辑 编程思想:1.面向过程编程 ---> 算法,逻辑(数学逻辑) 2.函数式编程 ---> 函数,...
    大漠判官1阅读 240评论 0 0
  • 类的声明 1.什么是类类就是对用有相同属性和相同功能的对象的集合对象就是类的实例类是抽象的,对象是具体的 从生活看...
    Heyjoky阅读 145评论 0 0
  • 一、面向对象编程 编程思想: 1.面向过程编程 ---> 算法,逻辑(数学逻辑)2.函数式编程 ---> 函数,模...
    xdxh阅读 224评论 0 0
  • 一、类和对象: 1.理论上的定义类:就是拥有相同功能和相同属性的对象的集合(类是抽象)对象:类的实例(对象是具体的...
    祖国的花朵_3980阅读 230评论 0 0
  • 面向对象编程 编程思想 1.面向过程编程 --> 算法,逻辑 2.函数式编程 --> 函数,模块 3....
    莫名ypc阅读 555评论 0 0