staticmethod classmethod property方法
@staticmethod 静态方法
函数修饰符,用来修饰一个函数,类似于装饰器
class Dog(object):
def __init__(self,name):
self.name = name def eat(self,food):
print('%s is eating %s'%(self.name,food)) d = Dog('二哈')
d.eat('包子') #二哈 is eating 包子
eat()方法上面加上 @staticmethod
class Dog(object):
def __init__(self,name):
self.name = name
@staticmethod
def eat(self,food):
print('%s is eating %s'%(self.name,food)) d = Dog('二哈')
d.eat('包子') #TypeError: eat() missing 1 required positional argument: 'food'
提示 food 少传递一个参数
删除food参数尝试下
class Dog(object):
def __init__(self,name):
self.name = name
@staticmethod
def eat(self):
print('%s is eating %s'%(self.name,'包子')) d = Dog('二哈')
d.eat() #TypeError: eat() missing 1 required positional argument: 'self'
提示少一个位置参数self ,self默认不是自动传进去的吗,静态方法就是截断方法与类的联系,就是说eat在这里就只是一个单纯的函数。
调用方式:类名。静态方法() 也可以用对象调用方法的方式。
class Dog(object):
def __init__(self,name):
self.name = name
@staticmethod
def eat():
print('%s is eating %s'%('5545','包子')) d = Dog('二哈')
d.eat() #5545 is eating 包子
Dog.eat() #5545 is eating 包子
要在静态方法里面调用self,就必须把self本身传进去
class Dog(object):
def __init__(self,name):
self.name = name
@staticmethod
def eat(self):
print('%s is eating %s'%(self.name,'包子')) d = Dog('二哈')
d.eat(d) #二哈 is eating 包子
静态方法名义上归类管理,实际上调用不了类或者实例的任何属性。
@classmethod 类方法
函数修饰符,同样用来装饰函数
class Dog(object):
def __init__(self,name):
self.name = name
@classmethod
def eat(self):
print('%s is eating %s'%(self.name,'包子')) d = Dog('二哈')
d.eat() #AttributeError: type object 'Dog' has no attribute 'name'
尝试访问类变量
class Dog(object):
name= '秋田'
def __init__(self,name):
self.name = name
@classmethod
def eat(self):
print('%s is eating %s'%(self.name,'包子')) d = Dog('二哈')
d.eat() #秋田 is eating 包子
类方法只能访问类变量,不能访问实例变量。
property 属性方法
class Dog(object):
name= '秋田'
def __init__(self,name):
self.name = name
@property
def eat(self):
print('%s is eating %s'%(self.name,'包子')) d = Dog('二哈')
d.eat() #TypeError: 'NoneType' object is not callable
去掉括号
class Dog(object):
name= '秋田'
def __init__(self,name):
self.name = name
@property
def eat(self):
print('%s is eating %s'%(self.name,'包子')) d = Dog('二哈')
d.eat #二哈 is eating 包子
把一个方法变成静态属性
作为一个属性,如果有参数要怎么传递?
既然是属性就是可以赋值的。
class Dog(object):
name= '秋田'
def __init__(self,name):
self.name = name
@property
def eat(self,food):
print('%s is eating %s'%(self.name,food)) d = Dog('二哈')
d.eat = '包子' #AttributeError: can't set attribute
直接赋值也是不可以的,同样需要装饰下
class Dog(object):
name= '秋田'
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 food is',food)
self._food = food d = Dog('二哈')
d.eat = '包子' #set food is 包子
d.eat #二哈 is eating 包子
属性赋值会触发 @eat.setter 下的 eat()方法。
删除属性
class Dog(object):
name= '秋田'
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 food is',food)
self.__food = food d = Dog('二哈')
d.eat = '包子'
d.eat
del d.eat #AttributeError: 'Dog' object has no attribute '_food'
默认是不能删除的,如果非要删除就要重写
class Dog(object):
name= '秋田'
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 food is',food)
self.__food = food @eat.deleter
def eat(self):
del self.__food
print('删除成功') d = Dog('二哈')
d.eat = '包子' set food is 包子
d.eat # 二哈 is eating 包子
del d.eat # 删除成功
d.eat # AttributeError: 'Dog' object has no attribute '_Dog__food'
d.eat调用了@property下的eat 因为这个方法里面有调用self.__food 而这个属性被删除了
有些场景不能简单的通过定义静态属性来实现的。所有要把方法做成属性。比如有些接口的API。
staticmethod classmethod property方法的更多相关文章
- Python staticmethod classmethod 普通方法 类变量 实例变量 cls self 概念与区别
类变量 1.需要在一个类的各个对象间交互,即需要一个数据对象为整个类而非某个对象服务. 2.同时又力求不破坏类的封装性,即要求此成员隐藏在类的内部,对外不可见. 3.有独立的存储区,属于整个类. ...
- python 类中staticmethod,classmethod,普通方法
1.staticmethod:静态方法和全局函数类似,但是通过类和对象调用. 2.classmethod:类方法和类相关的方法,第一个参数是class对象(不是实例对象).在python中class也 ...
- 【面试必问】python实例方法、类方法@classmethod、静态方法@staticmethod和属性方法@property区别
[面试必问]python实例方法.类方法@classmethod.静态方法@staticmethod和属性方法@property区别 1.#类方法@classmethod,只能访问类变量,不能访问实例 ...
- 封装和 property方法
封装其实就是一个类用双下划线把自己的属性或者方法给限制住 不让其他的类直接调用或者修改 必须通过这个类来进行操作,这个类通过双下划线__把自己的属性和方法给限制住了 封装就是私有的过程 把父类中的属 ...
- staticmethod classmethod修饰符
一.staticmethod(function) Return a static method for function.A static method does not receive an imp ...
- OC中property方法的使用
我们直入主题,关于property方法,我们先来了解一下相关的知识,首先是成员变量,实例变量,属性变量. 我们定义一个类来看一下 @interface Person :NSObject{ NSInte ...
- Python 利用@property装饰器和property()方法将一个方法变成属性调用
在创建实例属性时,如果直接把实例属性暴露出去,虽然写起来简单,但是存在一些风险,比如实例属性可以在外部被修改. 为了限制外部操作,可以通过一个set_score()方法来设置成绩,再通过一个get_s ...
- python静态属性@property、类方法@classmethod、静态方法@staticmethod和普通方法
静态属性:即将类的函数通过@property属性封装,封装后实例调用该函数时,不再需要在函数后面加(),而是用类似调用数据属性的方式直接调用函数名称即可执行函数. 静态属性既可以访问类的属性,也可以访 ...
- python staticmethod,classmethod方法的使用和区别以及property装饰器的作用
class Kls(object): def __init__(self, data): self.data = data def printd(self): print(self.data) @st ...
随机推荐
- CF580B Kefa and Company 尺取法
Kefa wants to celebrate his first big salary by going to restaurant. However, he needs company. Kefa ...
- get与post(转)
如果有人问你,GET和POST,有什么区别?你会如何回答? 我的经历 前几天有人问我这个问题.我说GET是用于获取数据的,POST,一般用于将数据发给服务器之用. 这个答案好像并不是他想要的.于是他继 ...
- 勤哲excel服务器WEB网页环境搭建问题解决
因为客户希望在浏览器上使用勤哲的功能,因此希望大家勤哲excel服务器的web环境. 他们用的是勤哲2010版,需要装到64位环境下.在搭建的时候,遇到2个主要问题. 问题1:编译器错误消息: BC3 ...
- springboot整合fastdfs
首先pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...
- 【笔记】Django基础(一)
---恢复内容开始--- [笔记]Django基础(一) oldboy Django 一 关于Python框架的本质 1. HTTP协议消息的格式: 请求(request) 请求方法 路径 HTTP ...
- 2016计蒜之道初赛第四场A
在每年的淘宝“双十一”时,访问量都会暴涨,服务器的请求会被流量分配程序按照一定策略,分发给不同的进程去处理.有一类请求,有两个进程可以接受分发的请求,其中一个进程所在服务器的配置.网络传输性能等都要优 ...
- js删除数组中的 "NaN"
[注意] js中的NaN不和任何值相等,包括自身 所以可以使用 x!=x 来判断x是否是NaN,当且仅当x为NaN时,表达式的结果为true NaN != NaN ; //true 可以依此删除数组中 ...
- Dev GridView RowCellClick事件与MouseDown事件
GridView处于可编辑状态,左键点击默认为“进入编辑”. 将GridView的OptionsColumn.AllowEdit设置为false后左键可触发RowCellClick.但有时候,既希望G ...
- 如何使用java代码进行视频格式的转换(FLV)
如何使用java代码进行视频格式的转换(FLV) 一,前言 在给网页添加视频播放功能后,发现上传的视频有各种格式,那么就需要将他么转换成FLV,以很好的支持在线视频播放. 公司一直在使用中,配合使用, ...
- js中url有中文的转码方法
转载:https://www.cnblogs.com/chiangfai/p/6073000.html