静态方法:通过加@staticmethod实现,只是名义上归类管理,实际上在静态方法里访问不了类或实例中的任何属性。
class Person(object):@staticmethoddef person_speak(obj):print('I like Hiphop!')me = Person()me.person_speak(me)Person.person_speak(me)# I like Hiphop! # I like Hiphop!
类方法:通过加@classmethod实现,只能访问类变量,不能访问实例变量。
class Person(object):sex = 'man'def __init__(self, sex):self.sex = sex# @classmethoddef hello(self):print('I am {}'.format(self.sex))me = Person('woman')me.hello()# I am woman# 去掉装饰器的注释后,输出# I am man
属性方法:通过加@property实现,把一个方法变成静态属性
class Person(object):n = 1@propertydef hello(self):print(self.n)me = Person()me.hello
# 输出
# 1
一般的属性都可以赋值,但是属性方法的赋值特殊处理
class Person(object):def __init__(self):self.__n = 1@propertydef hello(self):return self.__n@hello.setterdef hello(self, n):self.__n = nme = Person()print(me.hello) # 1me.hello = 666print(me.hello) # 666
同理,也可以删除
class Person(object):def __init__(self):self.__n = 1@propertydef hello(self):return self.__n@hello.setterdef hello(self, n):self.__n = n@hello.deleterdef hello(self):del self.__nme = Person()me.hello = 666del me.hellome.helloTraceback (most recent call last):File "oop.py", line 19, in <module>me.helloFile "oop.py", line 8, in helloreturn self.__nAttributeError: 'Person' object has no attribute '_Person__n'