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 ...
随机推荐
- 求用1g、2g、3g的砝码(每种砝码有无穷多个)称出10g的方案有几种
#include <iostream> using namespace std; // ; // sup是保存多项式的数组,sup[n]中的值代表指数为i的系数 ,下标i是x的指数 // ...
- Rabbitmq相关学习网址
1.安装文档: http://www.cnblogs.com/shuzhenyu/p/9823324.html 2.RabbitMq的整理 exchange.route.queue关系 https:/ ...
- LocalDate test
import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.tim ...
- vuex 浅认知
什么是Vuex? Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式. 采用了集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 什么情况下我应该使用 ...
- Linux虚拟机无法通过宿主机上网
解决方法 1.Windows: 确保相关服务已经启动 2.Linux: 确保相关服务已经启动 1) 确认Linux的IP地址和Windows在同一个网段: 若Windows给虚拟机分配的IP地址如下: ...
- Indexing the World Wide Web: the Journey So Far阅读笔记
文献文档用google搜索标题即可. term预处理:用空格切分,去除标点,去除撇号,归一化小写,去除变音符号,词干还原(?),去除停用词,挖掘词组. 索引选型工程最佳实践:term粒度.按doc分块 ...
- EOF是什么
我学习C语言的时候,遇到的一个问题就是EOF. 它是end of file的缩写,表示"文字流"(stream)的结尾.这里的"文字流",可以是文件(file) ...
- Spark集群安装MySQL环境
1.修改yum源 鉴于用国外的Yum源,速度比较慢,所以想到将国外的yum源改为国内的Yum源,这里选择使用比较多的阿里云源.具体修改方法可以参考此连接 我们先新建一个新的文件用来存放Yum源: [k ...
- stm32 PWM输出学习
STM32 的定时器除了 TIM6 和 7,其他的定时器都可以用来产生 PWM 输出.其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出.通用定时器也能同时产生多达 4路 ...
- Java多线程使用wait和notify实现生产者消费者模型
Java多线程使用wait和notify这两个关键字的学习,通过实现生成者与消费者来成对研究比较科学. 从两个字的意义来讲就是等待与通知这个简单道理. 现在先模拟一个缓存区存储,是用一个list实现的 ...