静态方法
通过 @staticmethod
装饰器可把其装饰的方法变为一个静态方法
普通的方法: 可以在实例化后直接调用,并且在方法里可以通过 self.
调用实例变量或类变量
**静态方法:**是不可以访问实例变量或类变量的
因此,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名来调用这个方法
class Dog(object):
def __init__(self, name):
self.name = name
@staticmethod # 把eat方法变为静态方法
def eat(self):
print("%s is eating" % self.name)
d = Dog("ChenRonghua")
d.eat()
执行程序会报错
想让上面的代码可以正常工作有两种办法
- 调用时主动传递实例本身给eat方法,即d.eat(d)
- 在eat方法中去掉self参数,但这也意味着,在eat中不能通过self.调用实例中的其它变量了
方法1
class Dog(object):
def __init__(self, name):
self.name = name
@staticmethod # 把eat方法变为静态方法
def eat(self):
print("%s is eating" % self.name)
d = Dog("ChenRonghua")
d.eat(d)
方法 2
class Dog(object):
def __init__(self, name):
self.name = name
@staticmethod # 把eat方法变为静态方法
def eat():
print(" is eating")
d = Dog("ChenRonghua")
d.eat()
类方法
类方法通过@classmethod
装饰器实现,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量
class Dog(object):
def __init__(self, name):
self.name = name
@classmethod
def eat(self):
print("%s is eating" % self.name)
d = Dog("ChenRonghua")
d.eat()
错误,说 Dog 没有 name 属性,因为 name 是个实例变量,类方法是不能访问实例变量的
class Dog(object):
name = "我是类变量"
def __init__(self, name):
self.name = name
@classmethod
def eat(self):
print("%s is eating" % self.name)
d = Dog("ChenRonghua")
d.eat()
属性方法
属性方法的作用就是通过@property
把一个方法变成一个静态属性
class Dog(object):
def __init__(self, name):
self.name = name
@property
def eat(self):
print(" %s is eating" % self.name)
d = Dog("ChenRonghua")
d.eat()
调用会出以下错误, 说NoneType is not callable, 因为eat此时已经变成一个静态属性了, 不是方法了, 想调用已经不需要加()号了,直接d.eat就可以了
class Dog(object):
def __init__(self, name):
self.name = name
@property
def eat(self):
print(" %s is eating" % self.name)
d = Dog("ChenRonghua")
d.eat
关于 静态方法、类方法、属性方法,今后还需多查多用.