python 类方法和静态方法总结

前言:
方法:方法是动态的是对象的行为,比如一个人可以跑,跳,是指具体做了什么动作或者行为
属性:属性是固有的是对象本身多携带的比如一个人的年龄,名字

类属性和实例属性
1.类属性就相当于全局变量是类对象和实例对象所共有的属性
2.实例对象的属性为实例对象所私有的

class Test(object):
    Lx = 'python'
    __age = 27
    def __init__(self,age):
        self.age = age
        pass

test = Test(20)
print(test.age) # 实例对象查看实例属性  正常访问
print(test.Lx)  # 实例对象查看类属性   正常访问
print(Test.Lx)  # 类对象查看类属性     正常访问
print(Test.age) # 类对象查看实例属性,这里会报错

print(test.__age) #错误,不能在类外通过实例对象访问私有的类属性
print(Test.__age) #错误,不能在类外通过类对象访问私有的类属性

#运行结果
20
python
python
------报错------
------报错------
------报错------

综上:
1.类对象可以访问类属性
2.类对象不能访问实例属性
3.实例对象可以访问实例属性和类属性,和类属性是包含关系

类方法和实例方法对比
1.类方法:类对象所拥有的方法,需要用装饰器@classmethod来标识其为类方法,类方法的第一个参数必须是类对象,类方法可以通过类对象和实例对象调用,类似与类属性可以被类对象和实例对象调用一样
2.实例方法:实例方法的第一个参数是实例对象self,通过self引用类属性或者实例属性,但是在相同名称的类属性和实例属性中,会先调用实例属性,因为实例属性优先级更高

class Test:
    name = 'Lx'
    # 类方法 用classmethod来装饰
    @classmethod
    def quety_name(cls):
        return cls.name  # 访问类属性

    @classmethod
    def change_name(cls,info):
        cls.name=info  # 在类方法中修改类属性
        return cls.name

    @classmethod
    def get_name(cls):
        return Test.name  # 通过类对象引用类属性

print(Test.quety_name())  # 类对象调用类方法
print(Test.change_name("kobe"))  # 类对象修改类属性
print(Test.get_name())  # 类对象调用类属性
test = Test()
print(test.change_name('James')) # 实例对象调用类方法



输入结果
Lx
kobe
kobe
James

注意点:
1…cls 指向 类对象(也就是Test)
2.一般以cls作为第一个参数,cls 也可以是其他名称,但是一般默认为cls

静态方法:
1.静态方法不需要额外定义参数,所以在静态方法中引用类属性的话,必须使用类对象的方法来引用
2.Python中的静态方法与python类级别的方法极为相似,不同之处在于静态方法绑定到一个类而不是该类的对象。这意味着可以在没有该类对象的情况下调用静态方法。 这也意味着静态方法无法修改对象的状态,因为它们没有绑定到对象。

创建静态方法有两种方式:

第一种:

class Test:

    def get_result(x,y):
        result = x + y
        return result
Test.get_result = staticmethod(Test.get_result)
print("result:",Test.get_result(1,2))

输出
result: 3


第二种:

class Test:
    @staticmethod
    def get_result(x,y):
        result = x + y
        return result

print("result:",Test.get_result(1,2))

输出
result: 3

1.静态方法有一个非常明确的用例。 当我们需要某些功能而不是对象,而需要完整的类时,我们可以使方法静态化。 当我们需要创建Utility方法时,这是非常有利的,因为它们通常与对象生命周期无关。
2.请注意,在静态方法中,我们不需要将self作为第一个参数传递。
# 打印当前系统时间
import time 
class Time:

    @staticmethod
    def showTime():
        return time.strftime("%H:%M:%S",time.localtime())
        pass
    

print(Time.showTime())

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

季布,

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值