我做了这两节课:
class A:
@staticmethod
def f(x):
print("x is", x)
class B:
def f(x):
print("x is", x)
并像这样使用它们:
>>> A.f(1)
x is 1
>>> B.f(1)
x is 1
即使没有装饰器,f
似乎也已成为B上的静态方法。我为什么需要装饰器?
答案 0 :(得分:1)
过去在Python 2中起着更大的作用,在此实例中,实例方法的实例性得到了更强的实施:
class Solution(object):
def lengthOfLongestSubstring(self, s):
""" First access all of the substrings """
ls_subs = []
unique_subs = []
for i in range(len(s)):
sub = s[i:]
ls_subs.append(sub)
""" Build versions of the substrings which contain unique chars """
for sub in ls_subs:
counter = 0
unique = ""
while counter < len(sub) and sub[counter] not in unique:
unique += sub[counter]
counter += 1
unique_subs.append(unique)
""" Find the longest one """
length = 0
for sub in unique_subs:
if len(sub) > length:
length = len(sub)
return length
您必须用>>> class B:
... def f(x):
... print("x is", x)
...
>>> B.f(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unbound method f() must be called with B instance as first argument (
got int instance instead)
标记静态方法。
这几天,@staticmethod
仍使该方法是静态的更加清晰,这有助于代码可读性和文档生成,并且它使您可以在实例上调用该方法而无需系统尝试绑定@staticmethod
答案 1 :(得分:1)
尝试这两个类,它们都有一个cry
方法,一个作为类方法,另一个作为带有self
传递的静态方法
class Cat:
def __init__(self):
self.sound = "meow"
def cry(self):
print(self.sound)
x = Cat()
x.cry()
meow
和其他班级
class Dog:
def __init__(self):
self.sound = "ruff-ruff"
@staticmethod
def cry(self):
print(self.sound)
x = Dog()
x.cry()
TypeError: cry() missing 1 required positional argument: 'self'
我们可以看到@staticmethod
装饰器基本上删除了self
传递的内容