【从零学习python 】40.python魔法方法(一)

简介: 【从零学习python 】40.python魔法方法(一)

魔法方法

Python 里有一种方法,叫做魔法方法。Python 的类里提供的,两个下划线开始,两个下划线结束的方法,就是魔法方法,魔法方法在恰当的时候就会被激活,自动执行。

魔法方法的两个特点:

  • 两侧各有两个下划线;
  • "咒语"名字已经由 Python 官方定义好,我们不能乱写。

1. __init__ 方法

__init__() 方法,在创建一个对象时默认被调用,不需要手动调用。在开发中,如果希望在创建对象的同时,就设置对象的属性,可以对 __init__ 方法进行改造。

class Cat:
"""这是一个猫类"""
    def __init__(self,name):  # 重写了 `__init__` 魔法方法
        self.name = name
    def eat(self):
        return "%s爱吃鱼"%self.name
    def drink(self):
        return '%s爱喝水'%self.name
"""
tom = Cat()
TypeError: __init__() missing 1 required positional argument: 'name'
这种写法在运行时会直接报错!因为 `__init__` 方法里要求在创建对象时,必须要传递 name 属性,如果不传入会直接报错!
"""
tom = Cat("Tom")  # 创建对象时,必须要指定 name 属性的值
tom.eat()   # tom爱吃鱼

注意:

  • __init__() 方法在创建对象时,会默认被调用,不需要手动的调用这个方法。
  • __init__() 方法里的 self 参数,在创建对象时不需要传递参数,python 解释器会把创建好的对象引用直接赋值给 self
  • 在类的内部,可以使用 self 来使用属性和调用方法;在类的外部,需要使用对象名来使用属性和调用方法。
  • 如果有多个对象,每个对象的属性是各自保存的,都有各自独立的地址。
  • 方法是所有对象共享的,只占用一份内存空间,方法被调用时会通过 self 来判断是哪个对象调用了实例方法。

2. __del__ 方法

创建对象后,Python 解释器默认调用 __init__() 方法;而当删除对象时,Python 解释器也会默认调用一个方法,这个方法为 __del__() 方法。

class Student:
    def __init__(self,name,score):
        print('__init__方法被调用了')
        self.name = name
        self.score = score
    def __del__(self):
        print('__del__方法被调用了')
s = Student('lisi',95)
del s
input('请输入内容')

3. __str__ 方法

__str__ 方法返回对象的描述信息,使用 print() 函数打印对象时,其实调用的就是这个对象的 __str__ 方法。

class Cat:
    def __init__(self,name,color):
        self.name = name
        self.color = color
tom = Cat('Tom','white')
# 使用 print 方法打印对象时,会调用对象的 __str__ 方法,默认会打印类名和对象的地址名
print(tom)   # `<__main__.Cat object at 0x0000021BE3B9C940>`

如果想要修改对象的输出结果,可以重写 __str__ 方法。

class Person:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __str__(self):
        return '哈哈'
p  = Person('张三',18)
print(p)   # 哈哈  打印对象时,会自动调用对象的 `__str__` 方法

一般情况下,我们在打印一个对象时,可能需要列出这个对象的所有属性。

class Student:
    def __init__(self,name,score):
        self.name = name
        self.score = score
    def __str__(self):
        return '姓名是:{},成绩是{}分'.format(self.name,self.score)
s = Student('lisi',95)
print(s)   # 姓名是:lisi,成绩是95分

4. __repr__ 方法

__repr__ 方法和 __str__ 方法功能类似,都是用来修改一个对象的默认打印内容。在打印一个对象时,如果没有重写 __str__ 方法,它会自动来查找 __repr__ 方法。如果这两个方法都没有,会直接打印这个对象的内存地址。

class Student:
    def __init__(self, name, score):
        self.name = name
        self.score = score
    def __repr__(self):
        return 'helllo'
class Person:
    def __repr__(self):
        return 'hi'
    def __str__(self):
        return 'good'
s = Student('lisi', 95)
print(s)  # hello
p = Person()
print(p)  # good

5. __call__ 方法

对象后面加括号,触发执行。

class Foo:
    def __init__(self):
        pass
    def __call__(self, *args, **kwargs):
        print('__call__')
obj = Foo()  # 执行 `__init__`
obj()  # 执行 `__call__`

总结:

  • 当创建一个对象时,会自动调用 __init__ 方法,当删除一个对象时,会自动调用 __del__ 方法。
  • 使用 __str____repr__ 方法,都会修改一个对象转换成为字符串的结果。一般来说,__str__ 方法的结果更加在意可读性,而 __repr__ 方法的结果更加在意正确性(例如: datetime 模块里的 datetime 类)。
相关文章
|
10天前
|
Python 容器
Python学习的自我理解和想法(9)
这是我在B站跟随千锋教育学习Python的第9天,主要学习了赋值、浅拷贝和深拷贝的概念及其底层逻辑。由于开学时间紧张,内容较为简略,但希望能帮助理解这些重要概念。赋值是创建引用,浅拷贝创建新容器但元素仍引用原对象,深拷贝则创建完全独立的新对象。希望对大家有所帮助,欢迎讨论。
|
1天前
|
Python
Python学习的自我理解和想法(10)
这是我在千锋教育B站课程学习Python的第10天笔记,主要学习了函数的相关知识。内容包括函数的定义、组成、命名、参数分类(必须参数、关键字参数、默认参数、不定长参数)及调用注意事项。由于开学时间有限,记录较为简略,望谅解。通过学习,我理解了函数可以封装常用功能,简化代码并便于维护。若有不当之处,欢迎指正。
|
12天前
|
存储 索引 Python
Python学习的自我理解和想法(6)
这是我在B站千锋教育学习Python的第6天笔记,主要学习了字典的使用方法,包括字典的基本概念、访问、修改、添加、删除元素,以及获取字典信息、遍历字典和合并字典等内容。开学后时间有限,内容较为简略,敬请谅解。
|
16天前
|
存储 程序员 Python
Python学习的自我理解和想法(2)
今日学习Python第二天,重点掌握字符串操作。内容涵盖字符串介绍、切片、长度统计、子串计数、大小写转换及查找位置等。通过B站黑马程序员课程跟随老师实践,非原创代码,旨在巩固基础知识与技能。
|
17天前
|
安全
Python-打印99乘法表的两种方法
本文详细介绍了两种实现99乘法表的方法:使用`while`循环和`for`循环。每种方法都包括了步骤解析、代码演示及优缺点分析。文章旨在帮助编程初学者理解和掌握循环结构的应用,内容通俗易懂,适合编程新手阅读。博主表示欢迎读者反馈,共同进步。
|
15天前
|
程序员 Python
Python学习的自我理解和想法(3)
这是学习Python第三天的内容总结,主要围绕字符串操作展开,包括字符串的提取、分割、合并、替换、判断、编码及格式化输出等,通过B站黑马程序员课程跟随老师实践,非原创代码。
|
12天前
|
Python
Python学习的自我理解和想法(7)
学的是b站的课程(千锋教育),跟老师写程序,不是自创的代码! 今天是学Python的第七天,学的内容是集合。开学了,时间不多,写得不多,见谅。
|
11天前
|
存储 安全 索引
Python学习的自我理解和想法(8)
这是我在B站千锋教育学习Python的第8天,主要内容是元组。元组是一种不可变的序列数据类型,用于存储一组有序的元素。本文介绍了元组的基本操作,包括创建、访问、合并、切片、遍历等,并总结了元组的主要特点,如不可变性、有序性和可作为字典的键。由于开学时间紧张,内容较为简略,望见谅。
|
12天前
|
存储 索引 Python
Python学习的自我理解和想法(4)
今天是学习Python的第四天,主要学习了列表。列表是一种可变序列类型,可以存储任意类型的元素,支持索引和切片操作,并且有丰富的内置方法。主要内容包括列表的入门、关键要点、遍历、合并、判断元素是否存在、切片、添加和删除元素等。通过这些知识点,可以更好地理解和应用列表这一强大的数据结构。
|
12天前
|
索引 Python
Python学习的自我理解和想法(5)
这是我在B站千锋教育学习Python的第五天笔记,主要内容包括列表的操作,如排序(`sort()`、``sorted()``)、翻转(`reverse()`)、获取长度(`len()`)、最大最小值(`max()`、``min()``)、索引(`index()`)、嵌套列表和列表生成(`range`、列表生成式)。通过这些操作,可以更高效地处理数据。希望对大家有所帮助!