Python学习之对象创建和魔术方法学习

编程入门 行业动态 更新时间:2024-10-26 02:36:57

Python学习之对象创建和<a href=https://www.elefans.com/category/jswz/34/1760871.html style=魔术方法学习"/>

Python学习之对象创建和魔术方法学习

Python学习之对象创建和魔术方法学习

  • 对象创建
    • new 方法
    • 获取引用计数
  • 魔术方法
    • new 方法
    • init 方法
    • del 方法
    • str 方法
    • repr 方法
    • str 与 repr 的区别
    • slots方法

对象创建

new 方法

__new__ 方法是一个类方法,该方法在对象的 __init__ 调用之前调用,且该方法的参数必须与 __init__ 方法的参数个数一致

例如:

class Goods(object):count = 0           # 记录调用的次数def __new__(cls, name, num, price):print('创建对象前先开辟空间,调用此方法,他是一个类方法,每创建一个对象调用一次')print('cls的ID:', (id(cls)))print('类名的id:', id(Goods))cls.count += 1                          # 统计调用的次数return object.__new__(cls)              # 调用父类object的 new 方法,创建空间def __init__(self, name, num, price):print('对象的初始化方法,每创建一个对象,执行一次')self.name = nameself.num = numself.price = priceif __name__ == '__main__':g1 = Goods('咖啡', 2, 60)g2 = Goods('牛奶', 20, 80)g3 = Goods('饮料', 2, 60)print('__new__的调用次数:{}'.format(Goods.count))        # 打印 __new__ 的调用次数

运行结果:

创建对象前先开辟空间,调用此方法,他是一个类方法,每创建一个对象调用一次
cls的ID: 2381704005456
类名的id: 2381704005456
对象的初始化方法,每创建一个对象,执行一次
创建对象前先开辟空间,调用此方法,他是一个类方法,每创建一个对象调用一次
cls的ID: 2381704005456
类名的id: 2381704005456
对象的初始化方法,每创建一个对象,执行一次
创建对象前先开辟空间,调用此方法,他是一个类方法,每创建一个对象调用一次
cls的ID: 2381704005456
类名的id: 2381704005456
对象的初始化方法,每创建一个对象,执行一次
__new__的调用次数:3

注意点:

  1. 每个对象创建时,__new____init__ 都会被执行且执行一次
  2. __new____init__ 两个方法的参数要一致
  3. __new__ 是类方法 __init__ 是实例方法

获取引用计数

class Student(object):def __init__(self, name):self.name = nameif __name__ == '__main__':s = Student('张三')       # 结果是2的原因是:实例化的时候一次,然后赋值给 s 又是一次引用import sysprint('实例化并赋值给变量的引用计数:{}'.format(sys.getrefcount(s)))s1 = sprint('赋值给s1后的引用计数:{}'.format(sys.getrefcount(s)))

运行结果:

实例化并赋值给变量的引用计数:2
赋值给s1后的引用计数:3

魔术方法

new 方法

该方法在上面已经讲过

init 方法

该方法是初始化对象的方法

del 方法

__del__ 方法在一个对象没有引用后,会自动调用来销毁对象

例1:

class Student(object):def __init__(self, name):self.name = namedef __del__(self):print('对象被销毁了')if __name__ == '__main__':s = Student('张三')       # 结果是2的原因是:实例化的时候一次,然后赋值给 s 又是一次引用s1 = ss2 = ss3 = simport sysprint('对象的引用计数为:{}'.format(sys.getrefcount(s)))

运行结果:

对象的引用计数为:5
对象被销毁了

在交互终端执行结果如下:

str 方法

__str__ 方法会返回打印对象的内容,默认情况是继承object 的该方法,返回对象的内存地址, 我们可以重写该方法

例1:
未重写

class Student(object):def __init__(self, name, age):self.name = nameself.age = ageif __name__ == '__main__':s = Student('张三', 18)print(s)

运行结果:

<__main__.Student object at 0x0000022E945351F0>

例2:
重写后

class Student(object):def __init__(self, name, age):self.name = nameself.age = agedef __str__(self):return '对象的名字是:{}, 年龄是:{}'.format(self.name, self.age)if __name__ == '__main__':s = Student('张三', 18)print(s)

运行结果:

对象的名字是:张三, 年龄是:18

repr 方法

该方法与 __str__ 类似,都是可以用来重写,返回的结果都是为了更好的获取信息

str 与 repr 的区别

区别:

  1. 如果两个方法都重写了,那么在调用的时候各自调用各自重写后的方法
  2. 如果只重写了 repr 当调用 str 的时候会调用重写后的 repr
  3. 如果只重写了 str 则在调用 repr 的时候会调用父类的

slots方法

__slots__ 会锁定对象属性,让对象在创建后不能新增属性,只能读取。该方法只对对象有效,对类无效
语法:

__slots__ = ("属性1", "属性2", ... , "属性n")

例:

class Student(object):__slots__ = ("name", "age")				# 固定对象属性def __init__(self, name, age):self.name = nameself.age = ageif __name__ == '__main__':s = Student('张三', 18)# s.gender = '男'						# 会报错,因为对象已经固定了属性Student.gender = "男"					# 对类不影响print(s.gender)							# 获取了类的gender属性print(s.name)print(s.age)

运行结果:

男
张三
18

更多推荐

Python学习之对象创建和魔术方法学习

本文发布于:2024-03-15 06:56:20,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1738334.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:魔术   对象   方法   Python

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!