类的方法

类的方法


####**类方法**   类方法通过\@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或者换一个不同的变量名即可
posted @ 2017-08-24 15:32  在下不想说  阅读(102)  评论(0编辑  收藏  举报