魔术方法学习"/>
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
注意点:
- 每个对象创建时,
__new__
和__init__
都会被执行且执行一次 __new__
和__init__
两个方法的参数要一致__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 的区别
区别:
- 如果两个方法都重写了,那么在调用的时候各自调用各自重写后的方法
- 如果只重写了
repr
当调用str
的时候会调用重写后的repr
- 如果只重写了
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学习之对象创建和魔术方法学习
发布评论