Python全栈开发教程——027

  • 特殊属性

我们已经详细讨论了面向对象编程的三个主要特征:封装、继承和多态。现在,我们将深入研究一些特殊的属性和方法,这些属性和方法通常以双下划线开始或结束。我们称之为特殊属性和方法。老师在课堂上肯定已经向你们介绍过这些特殊的属性和方法,所以这些内容并不陌生。接下来,我们来回顾一下这个主题。
首先,让我们来看看一个叫做dir的方法。这个方法可以查看你的对象的属性和方法,并查看该对象具有哪些属性和方法。我们将查看object的类对象,看看它有哪些属性和方法。你看到了吗?object类中有很多属性和方法。当然,你肯定已经使用过它了,因为在初始化时,你会创建一个类并编写一个初始化方法。这个方法是继承自object类的。现在,让我们看一下这些特殊的属性和方法究竟有什么作用。
首先,让我们看看一个属性叫做__dict__。__dict__是一个字典,它可以获取类对象或实例对象所绑定的所有属性和方法的字典。我们来演示一下。假设我们有一个名为class的类,它没有继承任何类。然后,我们再定义一个名为class_b的类。我有两个类,现在定义一个名为class_c的第三个类,该类继承了class_a和class_b。然后,我在这里定义了一个名为__init__的方法,并定义了一个名为name的实例属性。这样,我们就完成了三个类的定义。定义完成后,我们创建了一个class_c类的对象,名为x,并将其命名为"Jack"。现在,我们可以使用x.__dict__来查看它绑定了哪些属性。如果你运行它,你会看到它绑定了一个名为name的属性,它的值是"Jack"。如果你再传一个名为age的属性,你就可以写x.age。现在,当你再次运行它时,你会发现它绑定了两个属性:name和age,属性值分别为"Jack"和20。这个字典用于查看对象的属性和属性值。
除了__dict__外,还有哪些属性和方法?还有一个叫做__class__的属性。让我们来输出一下看看。你看到了吗?如果你查看一个实例的__class__属性,它会输出该实例所属的类。例如,如果你运行x.__class__,它会输出class_c。然后,还有一个叫做类的元组。这是因为涉及到多继承的问题。假设我们的class_c继承了class_a和class_b,那么class_c的负类可能会有多个。现在,我们可以使用class_c.__bases__来查看class_c的负类。你看到了吗?如果你运行它,它会输出class_a和class_b。如果你将class_b放在前面,它会输出class_b和class_a。这个元组中的第一个元素表示距离该类最近的负类。
接下来,让我们看看另一个特殊的属性,叫做__mro__。我们知道,class_c继承了class_a和class_b。现在,我们可以使用class_c.__mro__来查看class_c的类层次结构。你看到了吗?如果你运行它,它会输出class_c,class_a和class_b。这个元组中的元素表示类的继承顺序。在这种情况下,class_c会首先查找自己的方法,然后查找class_a的方法,然后查找class_b的方法。
除了上述特殊属性和方法之外,还有其他的一些特殊属性和方法。例如,__slots__属性是一个列表,它定义了实例可以具有的属性的名称。这个列表中的属性不会被存储在对象的__dict__字典中,从而提高了对象的内存使用效率。还有一个叫做__del__的方法,它在对象被删除时被调用。这个方法可以用来释放对象占用的资源。此外,还有一些其他的特殊方法,例如__str__和__repr__,它们可以定制对象的字符串表示形式。
总之,特殊属性和方法是面向对象编程中非常重要的概念。了解这些内容可以帮助你更好地理解面向对象编程,并帮助你更好地设计和实现你自己的程序。希望这些内容对你有所帮助。

  • 特殊方法

特殊属性已经讲解完了,现在我们来看一下特殊方法。还有一个叫做len的方法,你用过吗?我好像没有用过这两个下划线的len。但是在列表的时候,我们是不是求列表的长度,会用到一个内置函数len呢?然后呢,还有什么?我们的add、new以及__init__这些常用的特殊方法,我们现在来给大家演示一下。
在这里,我去新建一个Python文件,这个Python文件叫做“呆猫9”。然后,我在这写一个a等于20,b等于100。这是不是两个int类型的对象啊?在Python当中,一切皆对象。我的两个整数的对象为什么可以执行加法的运算并输出结果呢?来看一下输出来没,他的结果应该是多少?120。
实际上,在执行这个加法的时候,他的底层做了一件什么事情呢?这块是不是两个对象相加?这块是什么?这块是两个整数类型的对象的相加操作。那它的底层做了什么呢?它的底层实际上是调用了a这个对象的__add__方法去和b进行运算的,然后它的结果存储在d中。你在这输出d的时候,你发现结果完全相同。
我们现在写完了吗?你既然两个整数类型的对象可以执行加法操作,那么,我自定义的类型对象可以执行加法操作吗?比如说,我们创建一个Student类。然后,我在这里头写的叫做__Neit__,叫__init__是吧?然后,我写了一个name,只写了一个name就行了。然后,self.name点一个name是我复制的一个操作对吧。那我现在,Student类写完了,我去创建Student类型的对象。Stu1是Student类型的对象,Stu2也是Student类型的对象。Stu1叫张三,Stu2叫做李四。那我现在,我的Stu1可以加上Stu2吗?来输出一下啊,输出一下叫s,结果嘛,对吧,stu1去加上stu2,然后我们在这运行。你看程序怎么样?他报错了,他说不行,你这死丢人,他不能和死丢人的进行一个相加。那我就非得想让他相加怎么办呢?如果你非得想让他进行相加操作的话,你可以这样来写:
def __add__(self, other):
    return self.name + other.name

然后你在这里头干什么呢?在这里头写上Richard谁啊?self.name点一个name,再加上other.name。那么,你在这输出的时候,依然是张三和李四的一个连接操作。那我如果是我把这个剪走啊,我先把这个剪走。把它剪走之后,把它剪走之后,那然后你在这的时候,我们去运行它,那他就会告诉你是不允许啊,不允许,所以你明白这个操作了吗?如果想让两个对象具有相加的这种能力,你必须要去写一个叫__add__这个特殊的方法。
那么,我们刚刚讲到的len,它是一个内置函数,可以用来计算列表的长度。如果你想输出一个对象的长度,你就需要去编写len这样的方法。现在,我们来看看一个例子。我有一个列表,里面有一、一、二、二、三、三、四、四。我在这输出len,这个len是什么?这个len是我们的内置函数len,它可以去计算出这个列表的一个长度,即4。
这个len方法与列表对象中的len方法所返回的结果相同。这说明我们这个特殊方法所对应的是不是len这个内置函数?它们的结果是相同的。
那么,如果你想让两个对象具有相加的能力,你必须要去写一个__add__这样的特殊方法。但是,你必须要以两个下划线开始,并以两个下划线结束。所以,这个方法叫做特殊的方法。
如果你想输出一个对象的长度,你需要去编写len这样的方法。你可以在自定义的类中编写len方法来计算对象的长度。这个方法也需要以两个下划线开始,并以两个下划线结束。所以,它也是特殊的方法。
在Python中,一个类可以定义多个特殊方法,每个方法都有自己的用途。除了__add__和__len__之外,还有许多其他的特殊方法。
例如,你可以使用__str__方法来定义一个类如何被转换为字符串。这个方法可以使你的对象更容易地被打印和调试。下面是一个例子:
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return f"{self.name} is {self.age} years old."

p = Person("John", 30)
print(p)

在这个例子中,我们定义了一个Person类,它有一个name和一个age属性。我们还定义了一个__str__方法,它返回一个描述这个对象的字符串。最后,我们创建了一个Person对象,将其打印到控制台中。
特殊方法是Python中非常有用的概念。使用这些方法,你可以自定义类的行为,使其更加灵活和强大。希望本文能够帮助你更好地理解Python中的特殊方法,以及它们的运用场景。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

趋势洞察库

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值