python--类:普通方法、静态方法、类方法、魔术方法

文章目录

"""
类中的魔术方法:只要写了,系统就会调用,不需要自己去调用
重要:
__init__ # 创建完空间调用的第一个方法
__str__  # 可以打印出对象的更多内容
知道作用且都不需要重写
__new__  # 开辟空间,创建对象的时候,先开辟地址,然后再赋值给init,因此需要return
__del__  # 没有指针引用时会调用
__call__ # 想不想当做函数使用

"""
class Person:
    """调用时机:初始化对象时调用"""
    def __init__(self,name="sy"):
        # print("--------init",self)      # 3 --------init <__main__.Person object at 0x0000021251920288>
        self.name = name

    """调用时机:在创建对象(实例化)时就会调用"""
    def __new__(cls, *args, **kwargs):
        # print("--------new")            # 1 --------new
        position = object.__new__(cls)    # python3.6以后只需要cls
        # print(position)                 # 2 <__main__.Person object at 0x0000021251920288>
        return position                   # 返回一个position,再传给init

    """调用时机:在将对象当函数(对象调用)使用时,即p()"""
    def __call__(self, name):
        # print("--------call")
        # print("-------name:",name)
        pass
    
    """
    1 对象赋值,多个对象指向一个地址
    2 删除对象,删除对象对地址的引用
    3 查看引用次数
    4 调用时机:不论是被删除还是被执行等,当一块空间没地址指向我,没被引用。
    默认执行del,回收本次执行使用到的空间
    """
    def __del__(self):
        # 一般不自己写
        print("-------del")
        
    """调用时机:打印对象名,会调用其内容 """
    def __str__(self):
        return self.name  # 一定要有返回值

# 1 __new__
p = Person()
print(p)                   # 4 <__main__.Person object at 0x0000021251920288>

# 2 __call__
p("sy")                  # 想把对象当函数使用,需要重写call,传参之类的

# 3 __del__
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("p.name",p.name)
print(sys.getrefcount(p1))

# 4 __str__
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)  # cls: <class '__main__.Phone'>

    @classmethod
    def show_age(cls):
        print("修改后的年龄:",cls.__age)

    # 静态方法
    """
    类似类方法,需要装饰器(@)
    没有self参数,也没有cls参数
    只能用类方法和类属性,同时他不依赖cls,直接使用"类名".方法
    """
    @staticmethod
    def valid():
        print("Phone age",Phone.__age)

    # 私有变量
    __age = 18

    # def __str__(self):
    #     return self.

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()
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值