• 静态方法,类方法,属性方法


    1.静态方法:只是名义上归类管理,实际上在静态方法里访问不了类或实例中的任何属性。相当于类的工具包。不需要 self 参数了。

    class Dog(object):
        def __init__(self,name):
            self.name=name
        @staticmethod  #实际上跟类没什么关系了,相当于一个独立的函数。
        def eat(self,food):
            print("%s is eating %s"%(self.name,food))
    
        def drink(self,food):
            print("%s is drinking %s"%(self.name,food))
    
    d1=Dog("Lily")
    d1.drink("Cooola")  #drink正常执行
    d1.eat("baozi") #静态方法
    

     运行结果:

    Traceback (most recent call last):
      File "<encoding error>", line 13, in <module>
    TypeError: eat() missing 1 required positional argument: 'food'
    Lily is drinking Cooola
    

     2.类方法只能访问类变量,不能访问实例变量。

    class Dog(object):
        n=123
        def __init__(self,name):
            self.name=name
        @classmethod  #类方法,被修饰的下列函数只能访问类变量,不能访问实例变量。
        def eat(self,food):
            print("类变量%s" % self.n)
            print("%s is eating %s"%(self.name,food))
    
        def drink(self,food):
            print("%s is drinking %s"%(self.name,food))
    
    d1=Dog("Lily")
    d1.drink("Cooola")  #drink正常执行
    d1.eat("baozi") #类方法
    

     运行结果:

    Lily is drinking Cooola
    类变量123
    Traceback (most recent call last):
      File "<encoding error>", line 15, in <module>
      File "<encoding error>", line 8, in eat
    AttributeError: type object 'Dog' has no attribute 'name'
    

     3.属性方法

    把一个方法变成一个静态属性。隐藏实现细节。就不能加()调用了。可以给属性方法赋值。

    调用方法的时候需要加 (), 调用属性或变量的时候,不需要加().

    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("set to food:",food)
            self.__food=food
    
    d=Dog("Lily")
    d.eat
    d.eat="baozi" #属性方法
    d.eat
    

     运行结果:

    Lily is eating None
    set to food: baozi
    Lily is eating baozi
    

    4.属性方法在实例中不能以del d.eat 的方式删除。删除方法如下:

    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("set to food:",food)
            self.__food=food
    
        @eat.deleter  #删除它
        def eat(self):
            del self.__food
            print("删除完毕")
    
    d=Dog("Lily")
    d.eat
    d.eat="baozi" #属性方法
    d.eat
    del d.eat
    d.eat
    

     运行结果:

    Lily is eating None
    set to food: baozi
    Lily is eating baozi
    删除完毕
    Traceback (most recent call last):
      File "<encoding error>", line 26, in <module>
      File "<encoding error>", line 9, in eat
    AttributeError: 'Dog' object has no attribute '_Dog__food'
    
  • 相关阅读:
    POJ 2135 Farm Tour(最小费用最大流,变形)
    HDU 1503 Advanced Fruits (LCS,变形)
    HDU Senior's Gun (水题)
    POJ 3648 Wedding (2-SAT,经典)
    HDU 3549 Flow Problem 流问题(最大流,入门)
    解决在eclipse中导入项目名称已存在的有关问题
    如何将js导入时的小红叉去掉
    servlet传值到servlet传值问题
    转发重定向的用法
    parameter与attribute的使用场合(转载自草原和大树)
  • 原文地址:https://www.cnblogs.com/momo8238/p/7262097.html
Copyright © 2020-2023  润新知