• 静态方法

通过@staticmethod来定义,静态方法在类中,但在静态方法里访问不了类和实例中的属性,但静态方法需要类来调用

# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR" class Person(object):
def __init__(self,name):
self.name = name @staticmethod
def eat(self,food):
print("%s is eating %s"%(self.name,food)) if __name__ == '__main__':
p = Person('John')
p.eat('meat')

运行,报错

把eat方法的参数去掉,直接打印,可以直接调用

# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR" class Person(object):
def __init__(self,name):
self.name = name @staticmethod
def eat():
print("John is eating") if __name__ == '__main__':
p = Person('John')
p.eat()

运行结果

如果要给eat()传参数的话,可以把实例化的Person传入

# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR" class Person(object):
def __init__(self,name):
self.name = name @staticmethod
def eat(self):
print("%s is eating"%self.name) if __name__ == '__main__':
p = Person('John')
p.eat(p)

运行结果

  • 类方法

类方法通过@classmethod来定义

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

# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR" class Person(object):
name = 'Jack'
def __init__(self,name):
self.name = name @classmethod
def eat(self):
print("%s is eating"%self.name) if __name__ == '__main__':
p = Person('John')
p.eat()

运行结果

传入了实例变量John,但打印的却是Jack

因为类方法不能访问实例变量,所以类方法访问了类里的类变量

  • 属性方法

通过@property来定义属性方法

把类中的方法变为静态属性

# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR" class Person(object):
def __init__(self,name):
self.name = name @property
def eat(self):
print("%s is eating"%self.name) if __name__ == '__main__':
p = Person('John')
p.eat

按照调用属性的方法来调用属性方法

如果想给属性方法传参数的话,要使用setter

格式:@属性方法名.setter

# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR" class Person(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 the food:%s"%food)
self.__food = food if __name__ == '__main__':
p = Person('John')
p.eat
p.eat = 'meat' #通过赋值的方法来传参数,并调用用来传参数的eat方法
p.eat

运行结果

最先是None,经过赋值传参数后为meat

要删除属性方法的属性,可以使用deleter

格式:@属性方法名.deleter

# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR" class Person(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 the food:%s"%food)
self.__food = food @eat.deleter
def eat(self):
del self.__food
print('Del the food ok!') if __name__ == '__main__':
p = Person('John')
p.eat
p.eat = 'meat' #通过赋值的方法来传参数,并调用用来传参数的eat方法
p.eat
del p.eat #调用@eat.deleter来删除属性方法eat的food属性
p.eat

运行结果

前四条语句成功执行,删除food属性后,第五条语句没有food属性,报错

Python类(六)-静态方法、类方法、属性方法的更多相关文章

  1. python静态方法类方法属性方法

    Python的静态方法和类成员方法都可以被类或实例访问,两者概念不容易理清,但还是有区别的: 1)静态方法无需传入self参数,类成员方法需传入代表本类的cls参数: 2)从第1条,静态方法是无法访问 ...

  2. Python类总结-封装(私有属性,方法)

    封装基础 广义上面向对象的封装:代码的保护,面向对象的思想本身就是一种封装 只让自己的对象能调用自己类中的方法 狭义上的封装-面向对象三大特性之一(私有变量,用公有的方法封装私有属性,方法叫封装) 把 ...

  3. python类可以任意添加属性

    python类可以任意添加属性 class A(object): def __init__(self): self.name = "zhangsan" self.age = 18 ...

  4. python 类和对象的属性

    python类和对象的属性分为类属性和对象属性两大类,类属性属于类,而对象属性属于对象. 1. 父类的对象属性会被子类的对象继承. 2. 父类的类属性会被子类继承,还是作为类属性,如果父类改变了类属性 ...

  5. 孤荷凌寒自学python第二十四天python类中隐藏的私有方法探秘

    孤荷凌寒自学python第二十四天python类中隐藏的私有方法探秘 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天发现了python的类中隐藏着一些特殊的私有方法. 这些私有方法不管我 ...

  6. python类的静态方法和类方法区别

    先看语法,python 类语法中有三种方法,实例方法,静态方法,类方法. # coding:utf-8 class Foo(object): """类三种方法语法形式&q ...

  7. python面向对象(七)属性方法的添加

    ​ 通常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.下来我就讲下添加属性和方法,同时也将下限值添加属性方法. 添加属性 ...

  8. 第8.18节 Python类中内置析构方法__del__

    一. 引言 基本上所有支持OOP设计的语言都支持析构方法(也称析构函数),析构方法都是在对象生命周期结束时调用,一般用来实施实例相关生命周期内访问数据的扫尾工作,包括关闭文件.释放内存.输出日志.清理 ...

  9. python - 类的内置 attr 方法

    类的内置 attr 方法 #类的内置 attr 方法: # __getattr__ # __setattr__ # __delattr__ # __getattr__ #到调用一个类不存在数参数时,将 ...

随机推荐

  1. GDKOI2017游记

    去年的GDKOI在寒假(虽然我没参加),但由于一些机♂缘♂巧♂合♂,比赛时间变成了开学之后的第一周,于是直接导致了当我的同学们在认真学习的同时,我在广州无所事事地和同学谈♂笑♂风♂生♂.(太好了,可以 ...

  2. python爬虫-url

    特此声明: 以下内容来源于博主:http://blog.csdn.net/pleasecallmewhy                                     http://cuiq ...

  3. R语言笔记003——set.seed()函数

    set.seed()函数 set.seed()设定生成随机数的种子,让样本可重复. > x<-rnorm() # 生成4个随机数 > x [] 0.6599492 0.5881863 ...

  4. 一个简单的Javascript闭包示例

    //=====用闭包实现函数的Curry化===== //数字求和函数的函数生成器 function addGenerator( num ){ //返回一个简单的匿名函数,求两个数的和,其中第一个数字 ...

  5. iBatis.net 第一篇 搭建

    iBatis.net 和 iBatis 是有区别的,一个是在net下使用的,另一个是在java下使用. 要想使用,需要下载相关iBatis.net包 1.下载iBatis.net,在网上有很多下载cs ...

  6. shell学习之杂项

    ? 表示任意一个字符. > 重写 >> 追加 &> 将错误信息一并写入 Ctrl+Z 暂停 fg 恢复 jobs 查看所有已暂停任务 bg 丢到后台 env 查看系统环 ...

  7. VS10_慢_优化

    参考网址: http://blog.csdn.net/cll131421/article/details/15341367 1. 我暂时只做了这个: “ 一.VS2010选项视觉体验设置 工具-> ...

  8. review09

    String类在java.lang包中,由于java.lang包中的类被默认引入,所以可以直接使用String类.String对象的创建可以直接使用带字符串参数的构造方法 String s = new ...

  9. SSIS之序列容器

    序列容器是一种十分简单,但使用非常广泛的容器,它可以对控制流的任务流组件进行结构化处理,把一些业务相关的任务组件,放到一个序列容器中,使整个包看起来更加整洁.美观,就如同我们家里的书柜.衣柜似的,把不 ...

  10. sklearn.preprocessing.StandardScaler 离线使用 不使用pickle如何做

    Having said that, you can query sklearn.preprocessing.StandardScaler for the fit parameters: scale_ ...