文章目录
"""
类中的魔术方法:只要写了,系统就会调用,不需要自己去调用
重要:
__init__ # 创建完空间调用的第一个方法
__str__ # 可以打印出对象的更多内容
知道作用且都不需要重写
__new__ # 开辟空间,创建对象的时候,先开辟地址,然后再赋值给init,因此需要return
__del__ # 没有指针引用时会调用
__call__ # 想不想当做函数使用
"""
class Person :
"""调用时机:初始化对象时调用"""
def __init__ ( self, name= "sy" ) :
self. name = name
"""调用时机:在创建对象(实例化)时就会调用"""
def __new__ ( cls, * args, ** kwargs) :
position = object . __new__( cls)
return position
"""调用时机:在将对象当函数(对象调用)使用时,即p()"""
def __call__ ( self, name) :
pass
"""
1 对象赋值,多个对象指向一个地址
2 删除对象,删除对象对地址的引用
3 查看引用次数
4 调用时机:不论是被删除还是被执行等,当一块空间没地址指向我,没被引用。
默认执行del,回收本次执行使用到的空间
"""
def __del__ ( self) :
print ( "-------del" )
"""调用时机:打印对象名,会调用其内容 """
def __str__ ( self) :
return self. name
p = Person( )
print ( p)
p( "sy" )
p1 = p
p2 = p
import sys
print ( sys. getrefcount( p) )
p1. name = "hjx"
print ( "p1 name:" , p1. name)
print ( "p name:" , p. name)
del p
print ( "p1.name" , p1. name)
print ( sys. getrefcount( p1) )
print ( p1)
"""
类的方法:
普通方法、
类方法&静态方法:
不同:1 装饰器、2 参数
相同:
1 都只能访问类属性和方法,对象是没有办法法访问的
2 都可以通过类名访问
3 不依赖于对象,没对象也能用
与普通方法的区别:
1 装饰器
2 没对象、self
魔术方法
"""
class Phone ( ) :
def __init__ ( self) :
self. name = "xiaomi"
self. brand = "11"
self. price = 4999
def call ( self) :
print ( "------self" , self)
print ( "正在打电话。。。" )
for person in self. address:
for key, value in person. items( ) :
print ( value)
print ( "留言:" , self. note)
print ( "大减价:" , self. price)
"""
1 需要@classmethod
2 参数是当前类
3 类方法只能使用类属性,不能使用对象(self)属性。直接拿"类名"调用也可以
Phone.test()
4 不能直接调用类中的普通方法
作用:
只能访问类属性,可以在类对象创建之前进行一些操作、动作、功能(自己体会)
"""
@classmethod
def update_age ( cls) :
cls. __age = 20
print ( "cls:" , cls)
@classmethod
def show_age ( cls) :
print ( "修改后的年龄:" , cls. __age)
"""
类似类方法,需要装饰器(@)
没有self参数,也没有cls参数
只能用类方法和类属性,同时他不依赖cls,直接使用"类名".方法
"""
@staticmethod
def valid ( ) :
print ( "Phone age" , Phone. __age)
__age = 18
phone = Phone( )
phone. note = "我是phone"
phone. price = 3599
phone. address = [ { "123" : "mary" } , { "456" : "tome" } ]
phone. call( )
print ( "*" * 40 )
phone1 = Phone( )
phone1. note = "我是phone1"
phone1. price = 3499
phone1. address = [ { "789" : "sy" } , { "101" : "hjx" } ]
phone1. call( )
"""
声明一个类:有一块空的地址
创建一个对象:使用Phone类向内存申请一块和类大小相同的空间,
类中有__init__
类属性时公共的,类对象也是公共的,所以类对象在取属性时,也只能取公共的属性。
"""
"""类方法:不创建对象直接使用类方法修改属性"""
Phone. update_age( )
Phone. show_age( )
"""静态方法"""
Phone. valid( )