Python面向对象、类的抽象、类的定义、类名遵循大驼峰的命名规范创建对象、类外部添加和获取对象属性、类内部操作属性魔法方法__init__()__str__()__del__()__repr__()

简介: 面向对象和面向过程,是两种编程思想. 编程思想是指对待同一个问题,解决问题的套路方式.面向过程: 注重的过程,实现的细节.亲力亲为.面向对象: 关注的是结果, 偷懒.类和对象,是面向对象中非常重要的两个概念object 是所有的类基类,即最初始的类class 类名(object):类中的代码PEP8代码规范:类定义的前后,需要两个空行创建的对象地址值都不一样如dog和dog1的地址就不一样,dog的地址为2378043254528dog1的地址为23780448498408.类内部操作属性sel

@[toc]

1.概念介绍[了解]

==面向对象和面向过程,是两种编程思想.== 编程思想是指对待同一个问题,解决问题的套路方式.

  • 面向过程: 注重的过程,实现的细节.亲力亲为.

    • 函数
  • 面向对象: 关注的是结果, 偷懒.

    • 封装, 继承 和多态(三大技术)

2.类和对象[理解]

类和对象,是面向对象中非常重要的两个概念

    • 类是泛指的,指代多个, 是由对的抽象来的
    • 在代码中, 是通过关键字class定义的
  • 对象

    • 对象是特指的,指代一个,是具体存在的
    • 在代码中, 对象是由类创建的

3.类的组成

  • 类名
  • 属性: 特性, 变量

    • 一个类的属性有很多,值关注需要使用的,没有用到的不用管
  • 方法: 行为, 函数

4.类的抽象

  • 名词提炼法
  • 所见即所得

5.类的定义

随后的代码,使用狗类进行演示说明
类名: Dog(狗类)
属性:
姓名 name
年龄 age
....

方法:

吃  eat()
玩  play()
.....

5.1类名遵循大驼峰的命名规范

  • object 是所有的类基类,即最初始的类
  • class 类名(object):

类中的代码

  • PEP8代码规范:类定义的前后,需要两个空行

在这里插入图片描述

  • 新式类: 直接或者间接继承object的类, 在python3中,所有的类默认继承object类,即python3中所有的类都是新式类
  • 旧式类(经典类): 已经过时,不推荐使用

6.创建对象

# 定义类
class Dog(object):
    # 在类中定义的函数,称为方法, 函数的所有知识都可以使用
    def play(self):  # 暂时不管self ,
        print('萨摩耶在睡觉......')


# 创建对象 变量 = 类名()
# 定义类
class Dog(object):
    # 在类中定义的函数,称为方法, 函数的所有知识都可以使用
    def play(self):  # 暂时不管self ,
        print('萨摩耶在睡觉......')


# 创建对象 变量 = 类名()
dog = Dog()  # 创建一个对象,dog
print(id(dog))  # 2378043254528

dog1 = Dog()  # 创建一个对象 dog1
print(id(dog1))  # 2378044849840

# 可以使用对象调用类中的方法.  对象.方法名()
dog.play()  # 萨摩耶在睡觉......
dog1.play()  # 萨摩耶在睡觉......

创建的对象地址值都不一样如dog和dog1的地址就不一样,dog的地址为2378043254528dog1的地址为2378044849840

7.类外部添加和获取对象属性

class Dog(object):
    def play(self):
        print('萨摩耶在睡觉.....')


# 创建对象
dog = Dog()
dog.play()  # 萨摩耶在睡觉.....

# 给对象添加属性  对象.属性名 = 属性值
dog.name = '萨摩耶0'  # 给dog对象添加name属性,属性值是 萨摩耶0
dog.age = 1   # 给dog对象添加age属性,属性值是 1

# 获取对象的属性值  对象.属性名
print(dog.name)  # 萨摩耶0
print(dog.age)  # 1

# 修改属性值 和添加一样,存在就是修改,不存在,就是添加
dog.age = 3  # age 属性已经存在,所以是修改属性值
print(dog.age)  # 3

dog1 = Dog()  # 新创建一个对象 dog1
dog1.name = '萨摩耶1'
print(dog1.name)  # 萨摩耶1

8.类内部操作属性

  • self作为类中方法的第一个形参,在通过对象调用方法的时候,不需要手动的传递实参值,是python解释器
  • 自动将调用该方法的对象传递给self, 所以self这个形参代表的是对象
  • self就是一个形参的名字,可以写成其他的形参名,一般不修改这个名字,默认是self
class Dog(object):
    def play(self):
        print(f'self: {id(self)}')
        print(f'小狗 {self.name} 在快乐的拆家中.....')


# 创建对象
dog = Dog()
dog.name = '二哈'
print(f"dog : {id(dog)}")
dog.play()
print('-' * 30)
dog1 = Dog()
dog1.name = '金毛'
print(f"dog1: {id(dog1)}")
dog1.play()

在这里插入图片描述

9.魔法方法

在 python 的类中,有一类方法,这类方法以 两个下划线开头两个下划线结尾, 并且在满足某个特定条件的情况下,会自动调用. 这类方法,称为魔法方法

如何学习魔法方法:

  • 魔法方法在什么情况下会自动调用
  • 这个魔法方法有什么作用
  • 这个魔法方法有哪些注意事项

9.1__init__() [掌握]

调用时机: 在创建对象之后,会立即调用.

作用:

  • 用来给对象添加属性,给对象属性一个初始值(构造函数)
  • 代码的业务需求,每创建一个对象,都需要执行的代码可以写在 __init__
  • 注意点: 如果 __init__ 方法中,有出了 self 之外的形参,那么在创建的对象的时候,需要给额外的形参传递实参值 类名(实参)
class Dog(object):
    def __init__(self):  # self 是对象
        print('我是__init__方法,我被调用了')
        # 对象.属性名 = 属性值
        self.name = '萨摩耶'


# 创建对象
# Dog()
dog = Dog()
print(dog.name)
dog1 = Dog()
print(dog1.name)

在这里插入图片描述
带参数的__init__方法

class Dog(object):
    def __init__(self, name):  # self 是对象
        print('我是__init__方法,我被调用了')
        # 对象.属性名 = 属性值
        self.name = name

    def play(self):
        print(f"小狗{self.name}快乐的拆家中...")


# 创建对象 类名(实参值)
dog = Dog('二哈')
print(dog.name)
dog.play()
dog1 = Dog('金毛')
print(dog1.name)
dog1.play()

在这里插入图片描述

9.2__str__()[掌握]

调用时机:

  • print(对象), 会自动调用 __str__ 方法, 打印输出的结果是 __str__ 方法的返回值
  • str(对象) 类型转换,将自定义对象转换为字符串的时候, 会自动调用
  • 应用:

    1. 打印对象的时候,输出一些属性信息
    2. 需要将对象转换为字符串类型的时候
  • 注意点:

    1. 方法必须返回一个字符串`,只有 self 一个参数
class Dog(object):
    def __init__(self, name, age):
        # 添加属性
        self.name = name
        self.age = age

    def __str__(self):
        print('我是__str__, 我被调用了...')
        # 必须返回一个字符串
        return f"小狗的名字是{self.name}, 年龄是{self.age}"


# 创建对象
dog = Dog('萨摩耶', 2)
print(dog)  # 没有定义 __str__ 方法,print(对象) 默认输出对象的引用地址

str_dog = str(dog)  # 没有定义 __str__ 方法, 类型转换,赋值的也是引用地址
# print(str_dog)

在这里插入图片描述

9.3__del__()[理解]

析构函数

  • 调用时机:

    对象在内存中被销毁删除的时候(引用计数为 0)会自动调用 del 方法

    1. 程序代码运行结束,在程序运行过程中,创建的所有对象和变量都会被删除销毁
    2. 使用 del 变量 , 将这个对象的引用计数变为 0.会自动调用 del 方法
  • 应用场景:
    对象被删除销毁的时候,要书写的代码可以写在 __del__中.一般很少使用
  • 引用计数: 是 python 内存管理的一种机制, 是指一块内存,有多少个变量在引用,
  1. 当一个变量,引用一块内存的时候,引用计数加 1
  2. 当删除一个变量,或者这个变量不再引用这块内存.引用计数减 1
  3. 当内存的引用计数变为 0 的时候,这块内存被删除,内存中的数据被销毁

my_list1 = [5, 4] # 1
my_list2 = my_list # 2
del my_list1 # 1
del my_list2 # 0

class Dog(object):
    def __init__(self, name, age):
        # 添加属性
        self.name = name
        self.age = age

    def __str__(self):
        # 必须返回一个字符串
        return f"小狗的名字是{self.name}, 年龄是{self.age}"

    def __del__(self):
        print(f'我是__del__ 方法,我被调用了, {self.name}被销毁了.......')


# 创建一个对象
# dog = Dog('萨摩耶', 2)
# dog1 = Dog('金毛', 1)

dog = Dog('萨摩耶', 3)  # 萨摩耶 引用计数为1
dog2 = dog   # 萨摩耶 引用计数2
print('第一次删除之前')
del dog  # dog 变量不能使用, 萨摩耶对象引用计数 1
print('第一次删除之后')
print('第二次删除之前')
del dog2  # dog2变量不能使用, 萨摩耶对象的引用计数为 0, 会立即__del__ 方法
print('第二次删除之后')

在这里插入图片描述

import sys


class Dog(object):
    pass


dog = Dog()  # 1
print(sys.getrefcount(dog))  # 显示的时候,会比实际的多一个,因为调用这个的时候也会使计数加1
dog1 = dog  # 2
print(sys.getrefcount(dog))  # 显示的时候,会比实际的多一个,因为调用这个的时候也会使计数加1
del dog  # 1
print(sys.getrefcount(dog1))  # 显示的时候,会比实际的多一个,因为调用这个的时候也会使计数加1

9.4__repr__()[理解和 str类似]

my_list = ['hello', 'python', 'cpp']   # 列表中存储了三个字符串对象

print(my_list)


class Dog(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return f'{self.name}, {self.age}'

    def __repr__(self):
        """repr 方法和 str 方法,非常类似,也是必须返回一个字符串"""
        return f"{self.name}"


# 将三个Dog类的对象添加到列表中
my_list1 = [Dog('萨摩耶', 2), Dog('金毛', 4), Dog('哈士奇', 1)]
print(my_list1)

dog = Dog('萨摩耶', 2)
print(dog)   # __str__

10案例

10.1烤地瓜

class Potato(object):
    def __init__(self):
        self.status = '生的'
        self.total_time = 0
        self.name_list = []  # 保存调料的

    def cook(self, time):
        # 计算总时间
        self.total_time += time
        # 修改地瓜的状态
        if self.total_time < 4:
            self.status = '生的'
        elif self.total_time < 8:
            self.status = '半生不熟的'
        elif self.total_time < 12:
            self.status = '熟了'
        else:
            self.status = '烤糊了'

    def __str__(self):
        # buf_list = str(self.name_list)  # str([])  ===> '[]'
        # buf_list = buf_list.replace('[', '')
        # 字符串.join(列表), 将字符串添加到列表中的每个元素之间,组成新的字符串
        buf = ','.join(self.name_list)
        if self.name_list:
            return f"地瓜的状态:{self.status}, 烧烤总时间为:{self.total_time}, 调料有: {buf}"
        else:
            return f"地瓜的状态:{self.status}, 烧烤总时间为:{self.total_time},还没有添加调料"

    def add(self, name):
        self.name_list.append(name)


# 创建对象
potato = Potato()
print(potato)
potato.add('油')
print(potato)
potato.cook(5)
potato.add('辣椒面')
print(potato)
potato.cook(6)
potato.add('孜然')
print(potato)

10.2搬家具

# 定义家具类 Furniture 类
class Furniture(object):
    def __init__(self, name, area):
        # 类型
        self.name = name
        # 面积
        self.area = area

    def __str__(self):
        return f'家具的类型:{self.name}, 占地面积:{self.area}平方米'


# 定义房子类
class House(object):
    def __init__(self, address, area):
        self.address = address
        self.h_area = area
        self.furniture_list = []
        self.free_area = area  # 房子的剩余面积

    def add_furniture(self, obj_furniture):
        """ 添加家具 obj_furniture:  家具类的对象"""
        if self.free_area > obj_furniture.area:
            self.furniture_list.append(obj_furniture)
            # 修改剩余面积
            self.free_area -= obj_furniture.area
            print(f'家具:{obj_furniture.name} 添加成功')
        else:
            print('添加失败,换个大房子吧')

    # def __str__(self):  # 结果如图1
    #     # 自定义家具类,将该类的对象添加到列表中(容器), 直接打印列表,显示的是 自定义对象的引用地址
    #     if self.furniture_list:
    #         return f"房子的地址为:{self.address}, 占地面积为:{self.h_area}, 剩余面积为:{self.free_area}," \
    #                f"家具有:{self.furniture_list}"
    #     else:
    #         return f"房子的地址为:{self.address}, 占地面积为<{self.h_area}>, 剩余面积为:{self.free_area}," \
    #                f"还没有购买家具"

    def __str__(self):  # 结果如图2
        # 自定义家具类,将该类的对象添加到列表中(容器), 直接打印列表,显示的是 自定义对象的引用地址
        # [家具对象, 家具对象, ... ]  ---> [家具类型, 家具类型, .....]
        if self.furniture_list:
            buf_list = [obj.name for obj in self.furniture_list]
            return f"房子的地址为:{self.address}, 占地面积为:{self.h_area}, 剩余面积为:{self.free_area}," \
                   f"家具有:{','.join(buf_list)}"
        else:
            return f"房子的地址为:{self.address}, 占地面积为<{self.h_area}>, 剩余面积为:{self.free_area}," \
                   f"还没有购买家具"

    # def __repr__(self):  # 结果如图3
    #     if self.furniture_list:
    #         return f"房子的地址为:{self.address}, 占地面积为:{self.h_area}, 剩余面积为:{self.free_area}," \
    #                f"家具有:{self.furniture_list}"
    #     else:
    #         return f"房子的地址为:{self.address}, 占地面积为<{self.h_area}>, 剩余面积为:{self.free_area}," \
    #                f"还没有购买家具"


# 创建家具对象
bed = Furniture('豪华双人床', 15)
print(bed)

# 创建一个房子类对象
house = House('四合院', 225)
print(house)
house.add_furniture(bed)
print(house)

10.2.1图1

在这里插入图片描述

10.2.1图2

在这里插入图片描述

10.2.1图3

在这里插入图片描述

不知道怎么用repr修改,哪位大佬要是会的话可以在评论区留言,感谢!

目录
相关文章
|
2月前
|
Java 程序员 C++
Python 面向对象详解!
本文详细介绍了Python中的面向对象编程(OOP),包括类、对象、继承、封装、多态和抽象等核心概念。通过具体示例,解释了如何使用类定义对象的属性和方法,以及如何通过继承实现代码重用。文章还探讨了封装和多态的重要性,并介绍了私有属性和抽象类的使用方法。最后,总结了OOP的四大支柱:封装、抽象、继承和多态,强调了这些概念在Python编程中的应用。适合Java程序员扩展Python编程知识。
82 2
|
1月前
|
传感器 物联网 机器人
定义微Python
MicroPython 是一种精简高效的 Python 解释器,专为微控制器和嵌入式系统设计,支持通过 Python 代码进行快速开发和调试。它具有低资源消耗的特点,适用于物联网设备。
106 62
|
6天前
|
存储 数据处理 Python
Python如何显示对象的某个属性的所有值
本文介绍了如何在Python中使用`getattr`和`hasattr`函数来访问和检查对象的属性。通过这些工具,可以轻松遍历对象列表并提取特定属性的所有值,适用于数据处理和分析任务。示例包括获取对象列表中所有书籍的作者和检查动物对象的名称属性。
17 2
|
17天前
|
Shell Python
[oeasy]python049_[词根溯源]locals_现在都定义了哪些变量
本文介绍了Python中`locals()`函数的使用方法及其在调试中的作用。通过回顾变量赋值、连等赋值、解包赋值等内容,文章详细解释了如何利用`locals()`函数查看当前作用域内的本地变量,并探讨了变量声明前后以及导入模块对本地变量的影响。最后,文章还涉及了一些与“local”相关的英语词汇,如`locate`、`allocate`等,帮助读者更好地理解“本地”概念在编程及日常生活中的应用。
28 9
|
20天前
|
关系型数据库 开发者 Python
Python编程中的面向对象设计原则####
在本文中,我们将探讨Python编程中的面向对象设计原则。面向对象编程(OOP)是一种通过使用“对象”和“类”的概念来组织代码的方法。我们将介绍SOLID原则,包括单一职责原则、开放/封闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则有助于提高代码的可读性、可维护性和可扩展性。 ####
|
20天前
|
缓存 监控 算法
Python内存管理:掌握对象的生命周期与垃圾回收机制####
本文深入探讨了Python中的内存管理机制,特别是对象的生命周期和垃圾回收过程。通过理解引用计数、标记-清除及分代收集等核心概念,帮助开发者优化程序性能,避免内存泄漏。 ####
31 3
|
2月前
|
Python
Python面向对象(2)
【10月更文挑战第14天】
Python面向对象(2)
|
1月前
|
数据采集 存储 XML
Python爬虫定义入门知识
Python爬虫是用于自动化抓取互联网数据的程序。其基本概念包括爬虫、请求、响应和解析。常用库有Requests、BeautifulSoup、Scrapy和Selenium。工作流程包括发送请求、接收响应、解析数据和存储数据。注意事项包括遵守Robots协议、避免过度请求、处理异常和确保数据合法性。Python爬虫强大而灵活,但使用时需遵守法律法规。
|
2月前
|
设计模式 程序员 C语言
Python面向对象
【10月更文挑战第13天】
Python面向对象
|
1月前
|
开发者 Python
Python中__init__.py文件的作用
`__init__.py`文件在Python包管理中扮演着重要角色,通过标识目录为包、初始化包、控制导入行为、支持递归包结构以及定义包的命名空间,`__init__.py`文件为组织和管理Python代码提供了强大支持。理解并正确使用 `__init__.py`文件,可以帮助开发者更好地组织代码,提高代码的可维护性和可读性。
47 2

热门文章

最新文章