静态方法:
在类方法前面用 @staticmethod 装饰器即可把其装饰的方法变为一个静态方法
静态方法常规下不能自动实例化,即无法访问实例变量和类变量(简单说就是 'self' 失去了效果)
静态方法要实现不常规的实例化,可以调用实例变量和类变量的方法如下
调用类变量:class Person(object):
cls_name = '北京人'
def __init__(self, inputstr):
self.name = inputstr
@staticmethod
def speak(cls):
print('%s 讲普通话。' % cls.cls_name)
p = Person('江西人')
p.speak(p)
调用实例变量class Person(object):
cls_name = '北京人'
def __init__(self, inputstr):
self.name = inputstr
@staticmethod
def speak(self):
print('%s 讲普通话。' % self.name)
p = Person('江西人')
p.speak(p)
上面两个例子实际是同一种方法,self 和 cls 只是为了帮助区分实例对象和类对象,根据 .cls_name 和 .name 自动识别类变量和实例变量。
像是 Person.cls_name 这种在静态方法内略过 self 标识 直接调用类变量就比较粗暴了。
最主要的是 p.speak(p) 需要把实例化对象 p 再带进 p.speak() 的括号内 执行自动实例化。
第二种不用 self 标识 的方法:class Person(object):
cls_name = '北京人'
def __init__(self, inputstr):
self.name = inputstr
@staticmethod
def speak(): #标识符去掉
print('%s 讲普通话。' % '江西人') # 如果需要调用类变量,这里用粗暴的 Person.cls_name 替换掉 '江西人'
f = Person('四川人')
f.speak()
这种静态方法去掉标识不能访问实例变量,在实例化的过程中无论实例变量定义的是 '四川人' 还是其它,
最终返回定义的 '江西人'或者粗暴的 Person.cls_name ,
静态方法不能通过 self 标识自动实例化,即不能访问实例变量和类变量,其实跟类本身已经没什么关系了,
唯一和类的关联就是可以通过 Person.spack() 这种通过类名来调用这个方法
总结:
*(这里总结忽略了类变量调取的粗暴方式: 类名.属性 )*
常规的静态方法:不加标识符,无法访问实例变量或类变量,直接执行 >> 类名.方法() ( 上面例子: Person.spack() )
要实现访问实例变量或类变量:加标识符,执行 >> 实例化对象.方法(实例化对象) ( 上面例子: p.speak(p) )
|