• 面向对象补充之方法


    一、静态方法 @staticemethod  
    只是名义上归类管理, 实际上在静态方法里访问不了类或实例中的任何属性。
    实例:
    class Dog(object):
        '''这个类是描述狗这个对象的'''
    
        def __init__(self,name):
            self.name = name
    
        @staticmethod #实际上跟类没什么关系了,只是名义上归类管理, 实际上在静态方法里访问不了类或实例中的任何属性
        def eat(self):
            print("%s is eating %s" %(self.name,'d'))
    
      
    d=Dog('doggie')
    d.eat()
    

      返回:

    在类的动态方法前面加上了“@staticmethod”之后,这个动态方法就已经和类没有什么关系,self不会自动传入。

    二、类方法 @classmethod  
    只能访问类变量,不能访问实例变量
    实例:
    class Dog(object):
        '''这个类是描述狗这个对象的'''
        n='我不是实例变量'
    
        def __init__(self,name):
            self.name = name
    
        @classmethod  #只能访问类变量,不能访问实例变量
        def p(self):
            print('我是类变量,%s'%self.n)   #注意,此处只能调用类变量,传入的变量一定要写成self.var的格式。
    
        def eat(self):
            print('%s is eating...'%self.name)
    
    
    
    d=Dog('doggie')
    d.eat()
    d.p()    #没有被@classmethod的方法可以正常调用实例变量。
    

      返回:

    如果上面实例中的d.eat()也被“@classmethod”方法,那么则会返回下面的错误:




    三、属性方法 @property
    把一个方法变成一个静态属性 
    class Dog(object):
        '''这个类是描述狗这个对象的'''
    
        def __init__(self,name):
            self.name = name
    
        @property
        def eat(self):
            print('%s is eating...'%self.name)
    
    d=Dog('doggie')
    d.eat  
    

      返回:

    注意:由于“@property”方法已经把d.eat方法变成了一个静态属性,如果没有“@property”方法,执行d.eat,不会调用执行d.eat方法;但由于“@property”将d.eat方法转变为一个静态属性,则不能通过d.eat()调用,会返回“TypeError: 'NoneType' object is not callable”。

    如果被装饰的方法中不需要传入参数,则可以通过d.eat执行。

    如果需要传入参数,则可以通过@setter的方式给静态属性传入指定参数:

    class Dog(object):
        '''这个类是描述狗这个对象的'''
    
        def __init__(self,name):
            self.name = name
            self.__food=None
    
        @property
        def eat(self):
            print('%s is eating %s'%(self.name,self.__food))
    
        @eat.setter
        def eat(self,food):
            print('将food传入静态方法eat中的self.__food中去',food)
            self.__food=food
    
    d=Dog('doggie')
    d.eat
    d.eat='包子'
    d.eat
    

      返回:

    删除属性的方法:

    删除实例的方法是

    del 指定方法
    

      但是,如果直接执行 del d.eat会报错“AttributeError:can't delete attribute”,属性是不能用del删除的。

    下面是删除属性的方法:

    class Dog(object):
        '''这个类是描述狗这个对象的'''
    
        def __init__(self,name):
            self.name = name
            self.__food=None
    
        @property
        def eat(self):
            print('%s is eating %s'%(self.name,self.__food))
    
        @eat.setter
        def eat(self,food):
            print('将food传入静态方法eat中的self.__food中去',food)
            self.__food=food
    
        @eat.deleter
        def eat(self):
            del self.__food
            print('成功删除执行的私有属性')
    
    d=Dog('doggie')
    d.eat
    d.eat='包子'
    d.eat
    del d.eat
    d.eat

      返回:

    成功执行del d.eat(包含这条)以上的所有命令,但是在删除属性self.__food后,没有了self.__food属性,报错

  • 相关阅读:
    HDOJ2553 N皇后问题
    NYOJ284 坦克大战 BFS/优先队列
    NYOJ14 会场安排问题 贪心
    POJ1664 放苹果
    NYOJ119 士兵杀敌(三) RMQ
    POJ3264 Balanced Lineup RMQ/线段树
    POJ1127 Jack Straws
    HDOJ1128 Self Numbers
    水晶报表CrystalReports很强大也很简单!
    PetShop项目学习笔记(三)
  • 原文地址:https://www.cnblogs.com/zoe233/p/7156926.html
Copyright © 2020-2023  润新知