python类方法介绍

参考:
[1] https://zhuanlan.zhihu.com/p/61042358
[2] Python的 @property装饰器和@setter装饰器和@functools.wraps(func)装饰器

类方法

类方法由类调用,采用 @classmethod 装饰,至少传入一个 cls(代指类本身,类似 self )参数。执行类方法时,自动将调用该方法的类赋值给 cls。建议只使用类名.类方法的调用方式。(虽然也可以使用实例名.类方法的方式调用)
在这里插入图片描述

案例1

案例:classmethod的用法举例

class B:
    age = 10
    def __init__(self,name):
        self.name = name
    @classmethod
    def eat(cls): #普通函数
        print(cls.age)

    def sleep(self):
        print(self)

b = B("小贱人")
b.eat()

#运行结果为:10

案例2

  • 实例方法
    如果要构造一个类,接受一个网站和这个网站的状态码,然后打印出来。就像这样:
# -*- coding: utf-8 -*-
class gg:
    def __init__(self, url, stat):
        self.url = url
        self.stat = stat
    def outer(self):
        print(self.url)
        print(self.stat)
        
if __name__ == '__main__':
    a = gg('langzi', 200)
    a.outer() 

问题分析:这样就是使用实例方法,虽然可以实现,但是有的时候传入的参数并不是 (‘langzi’,200) 这样的格式,而是 (‘langzi-200’) 这样的,那该怎么做?

首先要把这个拆分,但是要使用实例方法实现起来很麻烦,这个时候就可以使用类方法

  • 类方法
# -*- coding: utf-8 -*-
class gg:
    url = 0
    stat = 0
    ## 此处为何要定义变量url和stat
    # 原因1:类gg需要2个属性,url与 stat
    # 原因2: 使用@classmethod, data=cls(url,stat),这个是类的实例化,实例需要属性来接收2个变量
    def __init__(self, url=0, stat=0):
        self.url = url
        self.stat = stat
 
    @classmethod
    # 装饰器,立马执行下面的函数(不实例化类的情况下,可直接通过 类名.函数名 的形式调用)
    def split(cls, info):
        # 这个函数,接收2个参数
        # 默认的cls就是这个类的init函数(构造器)
        # info 就是外面出来的
        url, stat = map(str, info.split("-"))
        # 这里转换成类格式化的结构
        data = cls(url, stat)
        # 这里就直接返回了函数结果,实际上就是经过处理后的实例
        return data
        
    def outer(self):
        print(self.url)
        print(self.stat)
 
if __name__ == '__main__':
    r=gg.split('langzi-200')
    a=gg("langzi", 200)
    a.outer()
    r.outer()

经过处理后,两种调用方式

    r = gg.split('langzi-200')
    a = gg("langzi",200)

我觉得本质区别就是,

gg.split(‘langzi-200’),一个先经过处理(有一定的逻辑),再实例化,
gg(“langzi”,200) 直接实例化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值