标签:style 关系 高级 ssi 需要 bsp error: odi font
普通的方法可以在实例化后直接调用,并且在方法里可以通过self.xxx调用实例变量或类变量,而静态方法是不可以访问实例变量或类变量,一个不能访问实例变量和类变量的方法,实际上已经和类本身没什么关系了。唯一与类有关联的就是有需要通过类名来调用这个方法。
通过@staticmethod装饰器把需其装饰的方法即可变成一个静态方法。
# _*_ coding:utf-8 _*_
class Dog(object):
def __init__(self, name):
self.name = name
@staticmethod # 属于类的一种方法,但无法访问类或实例的属性
def eat(self, food):
print("%s is eating %s" % (self.name, food))
def talk(self):
print("%s is talking." % self.name)
dog = Dog("Tom")
# 当eat变成静态方法后,再通过实例调用时就不会自动把实例本身当作一个参数传给self
dog.eat("Apple")
# TypeError: eat() missing 1 required positional argument: ‘food‘
# 正确的姿势
dog.eat(dog, "Apple")
再看看这个例子:
class Dog(object):
name = "JACK"
def __init__(self, name):
self.name = name
@staticmethod
def eat(name, food):
print("%s is eating %s" % (name, food))
def talk(self):
print("%s is talking." % self.name)
dog = Dog("Tom")
# 当作普通方法使用,传入位置参数
dog.eat("Jack", "Apple")
# 直接通过类名调用
Dog.eat("Jerry", "HotDog")
类方法通过@classmethod装饰器实现,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量。
class Dog(object):
def __init__(self, name):
self.name = name
def eat(self, food):
print("%s is eating %s" %(self.name, food))
@classmethod
def talk(self):
print("%s is talking." % self.name)
dog = Dog("Tom")
dog.eat(‘apple‘)
dog.talk() # 此时调用会报错,提示没有name这个属性。
再来看下面的代码:
class Dog(object):
name = "Jack"
def __init__(self, name):
self.name = name
def eat(self, food):
print("%s is eating %s" %(self.name, food))
@classmethod
def talk(self):
print("%s is talking." % self.name)
dog = Dog("Tom") # 实例化一只叫Tom的狗
dog.talk()
Jack is talking. # 结果却是Jack
标签:style 关系 高级 ssi 需要 bsp error: odi font
原文地址:http://www.cnblogs.com/kirusx/p/6973991.html