• 静态方法

通过@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. 10.0.4_对应的相关Windows服务

    对应 VMware Workstation 版本为:“10.0.4 build-2249910” 我的os是Win7 x64. Windows服务: 1. 服务名:VMware NAT Service ...

  2. SpringBoot- springboot集成Redis出现报错:No qualifying bean of type 'org.springframework.data.redis.connection.RedisConnectionFactory'

    Springboot将accessToke写入Redisk 缓存,springboot集成Redis出现报错 No qualifying bean of type 'org.springframewo ...

  3. array_merge函数的注意事项

    array_merge — 合并一个或多个数组 array_merge() 将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面.返回作为结果的数组 如果输入的数组中有相同的字符串键名 ...

  4. sp_rename sqlserver 表 列 索引 类型重命名

    --[语法] sp_rename [ @objname = ] 'object_name' , [ @newname = ] 'new_name' [ , [ @objtype = ] 'object ...

  5. reloc: Permission denied

    群中一个朋友安装EBS是在db 2/5 步骤中遇到如下错误:  Checking for errors ... .end std out.sqlplus: error while loading sh ...

  6. oracle管理优化必备语句以及oracle SQL语句性能调整

    本文转自http://www.dataguru.cn/article-3302-1.html oracle数据库管理优化必备语句: 1. SELECT T.START_TIME,T.USED_UBLK ...

  7. Spring_总结_04_高级配置(四)_bean的作用域

    一.前言 本文承接上一节:Spring_总结_04_高级配置(三)之处理歧义 1.单例bean Spring应用上下文中所有的bean默认都是单例的.也就是说,不管一个bean被注入到其他bean多少 ...

  8. uva11806(容斥原理)

    11806 - Cheerleaders Time limit: 2.000 seconds In most professional sporting events, cheerleaders pl ...

  9. Shiro-RememberMe

    概述 认证和记住我 建议 身份验证相关 实现 如果要自己做RememeberMe,需要在登录之前创建Token:UsernamePasswordToken(用户名,密码,是否记住我),且调用 User ...

  10. Django ImageField 上传图片并保存到数据库

    转自:http://logic0.blog.163.com/blog/static/188928146201371235435974/ Form代码: class ImageUploadForm(fo ...