类的方法
类的方法
####**类方法** 类方法通过\@classmethod装饰器实现,类方法和普通方法的区别是,类方法只能访问类变量,不能访问实例变量。 ```python class Student(object): age = '12' def __init__(self,name): self.name = name
@classmethod
def say_name(self):
print('name is %s'%self.name)
@classmethod
def say_age(self):
print('age is %s'%self.age)
s1 = Student('zhangsan')
s1.say_name() #不能访问实例变量
:type object 'Student' has no attribute 'name'
s1.say_age() #可以访问类变量
:age is 12
----------
####**静态方法**
通过\@staticmethod装饰器使其装饰的方法成为一个静态方法,不可以访问实例变量和类变量,与类本身并没有任何关系,唯一的关联就是通过类名来调用
```python
class Student(object):
def __init__(self,name):
self.name =name
@staticmethod
def say_name(self):
print('my name is %s'%self.name)
s1 = Student('tom')
-------------------------------------------------------------
s1.say_name() #并不能访问实例变量和类变量
>>>:say_name() missing 1 required positional argument: 'self'
--------------------------------------------------------------
s1.say_name(s1)
>>>:my name is tom
属性方法
属性方法的作用就是通过@property把一个方法变成一个静态属性
class Student(object):
def __init__(self,name):
self.name = name
@property
def say_hi(self)
print('my name is %s'%self.name)
s1 = Student('tom')
----------------------------------------------------------------
s1.say_hi()
>>>:TypeError: 'NoneType' object is not callable
----------------------------------------------------------------
s1.say_hi
>>>:my name is tom
----------------------------------------------------------------
一般情况下,想要设置一个静态变量,直接定义就可以了,但是更多的时候并不能通过简单的静态属性来解决问题。
更多的时候用户关心的只是一个处理的结果,而非过程。用户需要做的只是直接调用这个属性就好了。
因此属性方法最大的一个优势就是可以让调用者写出简短的代码,同时保证对参数进行必要的检查,这样,程序运行时就减少了出错的可能性。
class Student(object):
def __init__(self,name):
self.name = name
@property
def score(self):
print('%s get %s'%(self.name,self.__score))
@score.setter #可以修改属性的值
def score(self, value):
if value >0 and value < 100:
print('the score has been set to %s'%value)
self.__score =value
@score.deleter #删除属性的值
def score(self):
print('the score has been reset')
s1 = Student('zhangsan')
--------------------------------------------------------------
s1.score = 59
s1.score
del s1.score
>>>:the score has been set to 59
>>>:zhangsan get 59
>>>:the score has been reset
---------------------------------------------------------------
为什么是self.__score 而不是self.score
如果是self.score则会出现一个递归的情况,这里就涉及到一个语法规范的问题,即函数名与变量名同名,导致一直在调用score这个方法。
因此改成self.__score或者换一个不同的变量名即可