类方法(class method)与实例方法(instance method)和静态方法(static method)有哪些不同?

 

方法定义调用

实例方法

第一个参数必须是实例对象,一般约定为 “self”,通过它来传递实例的属性和方法(也可以传递类的属性和方法)只能由实例对象调用
类方法第一个参数必须是类对象,一般约定为 “cls”,通过它来传递类的属性和方法(不能传实例的属性和方法)实例对象 和 类对象 都可以调用
静态方法参数随意,但无法传递 类和实例 的任何属性和方法实例对象 和 类对象 都可以调用

静态方法的特别说明:

1.方法体中不使用 “实例对象 和 类对象” 中的任何属性和方法

2. 静态方法主要是用来存放逻辑性代码,逻辑上属于类,但是和类本身没有关系,也就是说在静态方法中,不会涉及到类中的属性和方法的操作(独立的:便于使用和运维)

#1、 实例方法
# 装饰器:无
# 第一个参数:self,代表实例对象
# 调用方式:需要先创建类的实例,再通过实例来调用
# 用途:用于访问或修改实例的属性
class Person1(object):
    # 类属性
    sex = '女'

    # 构造方法:每个类都有,名称固定为 __init__,声明类时自动执行
    def __init__(self, name, age):
        self.name = name  # 实例属性
        self.age = age
        print("这是 构造方法...\n")

    # 实例方法(又称:普通方法)
    def instance_method(self):
        print("instance_method:")
        print(self.name)  # 传递 实例属性
        print(self.age)
        print(self.sex)  # 传递 类属性


if __name__ == '__main__':
    p = Person1("李四", 20)

    # 实例方法的调用:只能由 实例对象 调用,不能用 类对象 调用
    p.instance_method()
    # Person.instance_method() # 报错
# 2、类方法
# 装饰器:@classmethod
# 第一个参数:cls,代表类本身
# 调用方式:可以通过类名直接调用,也能通过实例调用
# 用途:常用于创建工厂方法,或者修改类属性


class Person2(object):
    # 类属性
    sex = '女'

    # 构造方法:每个类都有,名称固定为 __init__,声明类时自动执行
    def __init__(self, name, age):
        self.name = name  # 实例属性
        self.age = age
        print("这是 构造方法...\n")

    # 类方法:可传递 类的属性和方法,但不能传递 实例的属性和方法
    @classmethod
    def class_method(cls):
        print("class_method:")
        # print(cls.name)  # 传递 实例属性 报错
        # print(cls.age)
        print(cls.sex)  # 传递 类属性


if __name__ == '__main__':
    p = Person2("李四", 20)

    # 类方法的调用:实例对象 和 类对象 均可
    p.class_method()
    Person2.class_method()
#3、 静态方法
# 装饰器:@staticmethod
# 第一个参数:无特殊参数
# 调用方式:可以通过类名直接调用,也能通过实例调用
# 用途:用于封装和类相关的工具函数,逻辑上属于类,但不依赖类或实例的状态


import time


class Person3(object):
    # 类属性
    sex = '女'

    # 构造方法:每个类都有,名称固定为 __init__,声明类时自动执行
    def __init__(self, name, age):
        self.name = name  # 实例属性
        self.age = age
        print("这是 构造方法...\n")

    # 静态方法:无法传递 类和实例 的任何属性和方法
    @staticmethod
    def static_method():
        print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()))
        # self.name  # 报错
        # cls.sex  # 报错


if __name__ == '__main__':
    p = Person3("李四", 20)

    # 静态方法调用:实例对象 和 类对象 均可
    p.static_method()
    Person3.static_method()


 这是运行结果:

静态方法的特别说明:

1.方法体中不使用 “实例对象 和 类对象” 中的任何属性和方法

2. 静态方法主要是用来存放逻辑性代码,逻辑上属于类,但是和类本身没有关系,也就是说在静态方法中,不会涉及到类中的属性和方法的操作(独立的:便于使用和运维)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值