zoukankan      html  css  js  c++  java
  • 静态方法,类方法,属性方法

    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'
    
  • 相关阅读:
    Python内置函数 __import__ 动态加载模块
    Django_静态资源配置和ajax(九)
    GO语言学习(五)Go 语言基础语法
    GO语言学习(四)GO语言语言结构
    GO语言学习(三)GO语言学习API文档
    GO语言学习(二)Windows 平台下 LiteIDE 的安装和使用
    GO语言学习(一)Windows 平台下 Go 语言的安装和环境变量设置
    VS无法访问IIS元数据库 您没有足够的特权访问计算机上的IIS网站
    本地存储localStorage以及它的封装接口store.js的使用
    操作类封装
  • 原文地址:https://www.cnblogs.com/momo8238/p/7262097.html
Copyright © 2011-2022 走看看