python 中staticmethod和classmethod、实例属性、类属性

 

首先值得说明的是staticmethod和classmethod都是python中定义的装饰器,用的时候需要在前面加@

即@staticmethod和@classmethod

翻译过来staticmethod是静态方法, classmethod是类方法

下面是一个简单的例子:

class A(object):
    v1 = "I belong to class A"

    def func(self, x):
        print("executing func(%s,%s)" % (self, x))

    @classmethod
    def class_func(cls, x):
        print("executing class_func(%s,%s)" % (cls, x))
        print(cls.v1)

    @staticmethod
    def static_func(x):
        print("executing static_func(%s)" % x)
        print(x)

        
a = A()

a.func(1)  #"""对象访问普通方法"""

a.class_func(2)  #""" 对象访问类方法"""
A.class_func(3) #""" 类访问类方法"""
a.static_func(4)  # """ 对象访问静态方法"""
A.static_func(5)  # """ 类访问静态方法"""
#static_func(5)
A.v1
fn = A.func
fn(1,2)
print(A.__dict__)
print(a.__dict__)
"""通过打印法线,a的调用都是去A类中查找的"""

 

在class A中:

  • 没有任何装饰器修饰的函数"func",是属于对象的方法,只能访问实例的其他成员。所以func(self,x)传入的第一个参数是"self",指的是实例本身,即例子中的a。只能通过实例调用。
  • classmethod是类的方法,即上例中用@classmethod修饰的函数"class_foo",是属于类的方法,所以class_foo(cls,x)传入的第一个参数是"cls",指类本身,即例子中的A。这个方法是一个类方法,虽然属于类,需要访问类的其他成员,但是不用访问实例的其他成员。并且可以在不把类实例化的前提下,通过类名进行调用,但是值得注意的是,classmethod也可以通过实例调用。典型用途:工厂模式的实现。
  • staticmethod是静态方法,即这个方法是一个普通方法,虽然属于类,但是不用访问类和实例的其他成员。并且可以在不把类实例化的前提下,通过类名进行调用值得注意的是,staticmethod也可以通过实例调用。典型用途:工厂模式的实现。
"""如果Student类本身需要绑定一个属性呢?可以直接在class中定义属性,这种属性是类属性,归Student类所有:
"""

class Student(object):
    name = 'Student'

"""当我们定义了一个类属性后,这个属性虽然归类所有,但类的所有实例都可以访问到。来测试一下:"""


>>> class Student(object):
...     name = 'Student'
...
>>> s = Student() # 创建实例s
>>> print(s.name) # 打印name属性,因为实例并没有name属性,所以会继续查找class的name属性
Student
>>> print(Student.name) # 打印类的name属性
Student
>>> s.name = 'Michael' # 给实例绑定name属性
>>> print(s.name) # 由于实例属性优先级比类属性高,因此,它会屏蔽掉类的name属性
Michael
>>> print(Student.name) # 但是类属性并未消失,用Student.name仍然可以访问
Student
>>> del s.name # 如果删除实例的name属性
>>> print(s.name) # 再次调用s.name,由于实例的name属性没有找到,类的name属性就显示出来了
Student

从上面的例子可以看出,在编写程序的时候,千万不要对实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

隨意的風

如果你觉得有帮助,期待你的打赏

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

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

打赏作者

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

抵扣说明:

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

余额充值