kaiyun全站网页版登录 Python | 魔法方法和方法重写

发布于:25-07-27 播放次数:

魔法方法总结

字符串与字节序列的表示涉及:repr、str、format以及bytes等方法,它们主要负责执行格式化处理。

数值类型转换涉及以下函数:绝对值转换、布尔值转换、复数值转换、整数值转换、浮点值转换、哈希值转换以及索引值转换。

在集合模拟中,我们经常使用到诸如len、getitem、setitem、delitem以及contains等方法。这些方法构成了列表等数据结构的基础功能。

迭代方法包括:__iter__、__reversed__、__next__,它们主要应用于实现迭代器和生成器功能。

可调用模拟:__call__。主要是加上括号就能触发调用。

上下文管理涉及两个关键操作:进入和退出。提及with语句读取文件,这实际上是在使用上下文管理器。

类实例的生成与终止涉及:构造函数(__new__)、初始化方法(__init__)、析构函数(__del__)。这些是创建类实例时频繁调用的方法。

属性操作相关的方法包括:__getattribute__、__getattr__、__setattr__、__delattr__以及__dir__。这些方法的核心功能是处理对象的属性。

属性描述符,如__get__、__set__、__del__,是用于设定属性行为的标识符。

方法重写

若父类中的方法无法满足特定需求,子类中可以对相应的方法进行重新定义,以下是一个具体的例子:

class Parent:   #定义父类
   def myMethod(self):
       print('调用父类方法')
       
class Child(Parent):   #定义子类
   def myMethod(self):
       print('调用子类方法')
       
c=Child()     #子类实例
c.myMethod() #子类调用重写方法
通过子类实例c,调用父类中已实现的方法myMethod()。
#super()是用于调用父类(超类)的一个方法。
#调用子类方法
#调用父类方法

魔法方法

在Python编程语言里,存在一些预先定义好的特殊函数,它们在执行特定任务时能够自动触发,这类函数被称为魔法函数。接下来,我将为大家介绍几种较为常见的魔法函数。

class myMethod(str):
   def __new__(cls,string):
       string=string.upper()
   
X 等于调用名为“DataScience”的 myMethod 函数。
print(X)
#DATASCIENCE

__ init__:

初始化函数用于在创建实例对象时进行赋值操作,它是在__new__方法之后调用的。在调用__init__方法时,必须至少包含一个参数self,即由__new__方法返回的实例对象。此外,__init__方法可以在__new__方法的基础上执行额外的初始化任务,而它本身并不需要返回任何值。

class Dog:
初始化时,需指定颜色和品牌参数。
       self.color=color
       self.brand=brand
这只小狗是一种黑色拉布拉多犬种。
print(puppy)
#<__main__.Dog object at 0x0000028EC0609DC8>

接下来,我们将通过一个实例来展示如何巧妙融合__init__与__new__这两种特殊方法。

class A(object):
   pass
class B(A):
   def __init__(self):
       print('__init__被调用')
   def __new__(cls):
       print('__new__被调用')
       print(id(cls))
       return object.__new__(A)
在本次操作中,我们选择了参数A而非cls,然而,在执行__new__方法时,未能准确返回当前类cls的实例。
b=B()
print(b)
print(type(b))  #类型所继承的基类
print(id(A))
print(id(B))
'''
__new__被调用
2812126085768
<__main__.A object at 0x0000028EC0574108>

2812126083880
2812126085768
'''

观察运行结果可知,在__ new__ 函数中,参数cls和B对象的id值相同云开·全站体育app登录,这说明__ new__ 函数中预设的参数cls实际上指向了B类本身。然而,在执行返回操作时,并未准确地将当前类cls的实例返回,而是错误地返回了其父类A的实例。因此,__ init__ 魔法方法并未被触发。尽管__ new__ 函数定义在B类中,但其所创建并输出的却是一个A类的实例对象。

现在,我们将函数return中的参数A替换为clskaiyun.ccm,然后观察运行后的结果。

class A(object):
   pass
class B(A):
   def __init__(self):
       print('__init__被调用')
   def __new__(cls):
       print('__new__被调用')
       print(id(cls))
       return object.__new__(cls)
       #注意此处采用了参数A而不是cls,__new__没有正确返回当前类cls的实例
b=B()
print(b)
print(type(b))  #类型所继承的基类
print(id(A))
print(id(B))
'''
__new__被调用
2812126087656
__init__被调用
<__main__.B object at 0x0000028EC057C148>

2812126086712
2812126087656
'''

观察可知,每当新的实例正确生成并归属于类cls时kaiyun全站网页版登录,初始化方法__ init__会被触发,此时,一个属于B类的实例对象便被创建并输出。

__ class__:

获得已知对象的类 ( 对象.__ class__)。

基础格式如下:

class My:
   pass
a=A()
print(a.__class__)
#

在某些情况下,使用类这一概念是恰当的,尤其是当某个类的一个成员变量被该类所有实例共享时。

下面看一个例子:

class My:
   count=0
   def addcount(self):
       self.__class__.count +=1
       
a=My()
a.addcount()
print(a.count)
print('*'*50)
b=My()
b.addcount()
print(b.count)
#1
严禁对特定内容进行篡改,确保信息的真实性,维护数据的一致性。
#2

观察运行结果可知,尽管a与b是两个独立的My类实例,但在使用__ class__后,对两个对象的addcount方法进行调用,得到的对象count属性却持续增加。这时,self.__ class__ .count已不再是某个对象独有的属性,而是转变为该类所有实例共享的属性,其作用类似于self.A.count。若仅将self.__ class__ .count += 1替换为self.count += 1,那么__ class__的作用便会显得尤为突出。

class My:
   count=0
   def addcount(self):
       self.count +=1
       
a=My()
a.addcount()
print(a.count)
print('*'*50)
b=My()
b.addcount()
print(b.count)
#1
#**************************************************
#1

__ str__:

在执行对象转字符串的str(对象)操作过程中,若需输出对象详情,必须确保__str__方法返回一个字符串形式的描述,这描述是对实例对象的一种文字表述。实际上,__str__方法在print函数中是被默认调用的。当我们使用print(实例对象)时,系统会自动调用__str__方法,并获取其返回的字符串描述。若非必须借助str()函数进行转换,当尝试输出一个类的实例时,print函数将优先调用该类中定义的__str__方法。

class My():
   def __init__(self,name):
       self.name=name
   def __str__(self):
我属于My类,是my这个实例对象,我的名字是%s。
   
my=My('小王')
print(My)
print(my)
#
#我是My类的实例对象my,我的名字叫小王

类的专有方法总结