@classmethod @staticmethod 个人理解
官方解释
- @classmethod
一个类方法把类自己作为第一个实参, 就像一个实例方法把实例自己作为第一个实参.
语法格式:
class C:
@classmethod
def f(cls, arg1, arg2, ...): ...
- @staticmethod
静态方法不会接收隐式的第一个参数.
语法格式:
class C:
@staticmethod
def f(arg1, arg2, ...): ...
特性
相同点
- 可不实例化类直接调用
import time
class School(object):
school_name = "A_Tester_School"
address = "China_Sichuan"
def __init__(self, student_name):
self.student_name = "a student of A_Tester_School, name is: {} ".format(student_name)
def age(self, birthday):
return time.localtime().tm_year - birthday
@classmethod
def get_school(cls):
return cls.school_name, cls.address
@staticmethod
def get_address():
return "hello world."
# 实例调用
my_school = School("Hoo")
print(my_school.age(1991))
print(my_school.get_school())
print(my_school.get_address())
print("-"*50)
# 不实例化调用
print(School.get_school())
print(School.get_address())
# 28
# ('A_Tester_School', 'China_Sichuan')
# hello world.
# --------------------------------------------------
# ('A_Tester_School', 'China_Sichuan')
# hello world.
不同点
| 类别 | @classmethod | @staticmethod |
|---|---|---|
| 语法格式 | 至少一个参数,第一个参数为类本身 | 可无参数 |
个人理解
- 二者区别
- staticmethod装饰的函数就是一个普通的函数, 本质上与类没有半毛钱关系.所以无法使用类的局部变量(如:School类中的school_name), 无法操作类等.
- classmethod装饰的函数第一个入参为类本身, 因此可操作类, 包括引用类的staticmethod装饰的函数.
class ChildSchool(School):
@classmethod
def get_student_info(cls, student_name, birthday):
my_school = cls(student_name) # 实例化类
age1 = my_school.age(birthday) # 调用实例方法
print("school_name: {}".format(cls.school_name)) # 不实例类, 调用类局部变量
print("address: {}".format(my_school.address)) # 实例类, 调用类局部变量. 此处my_school可换成cls
print("age: {}".format(age1))
print("introduction: {}".format(my_school.student_introduction)) # 调用实例属性
print("this a error address: {}".format(cls.get_address())) # 调用类静态方法
ChildSchool.get_student_info("Hoo", 1991)
# school_name: A_Tester_School
# address: China_Sichuan
# age: 28
# introduction: a student of A_Tester_School, name is: Hoo
# this a error address: hello world.
@classmethod @staticmethod 个人理解的更多相关文章
- 记录一个 关于 python 普通方法,静态方法和类方法 的介绍。@classmethod @staticmethod
上班时间 只贴看到最厉害的答案 回头总结 http://stackoverflow.com/questions/12179271/python-classmethod-and-staticmethod ...
- 初识面向对象(钻石继承,super,多态,封装,method,property,classmethod,staticmethod)
组合 什么有什么的关系 一个类的对象作为另一个类的对象继承 子类可以使用父类中的名字(静态属性 方法)抽象类和接口类 只能不继承,不能被实例化 子类必须实现父类中的同名方法———规范代码 metacl ...
- python面试题之下面这些是什么意思:@classmethod, @staticmethod, @property?
回答背景知识 这些都是装饰器(decorator).装饰器是一种特殊的函数,要么接受函数作为输入参数,并返回一个函数,要么接受一个类作为输入参数,并返回一个类. @标记是语法糖(syntactic s ...
- Python类中装饰器classmethod,staticmethod,property,
@classmethod 有的时候在类中会有一种情况,就是这个方法并不需要使用每一个对象属性 因此 这个方法中的self参数一个完全无用的参数,使用classmethod class A: __cou ...
- python 全栈开发,Day22(封装,property,classmethod,staticmethod)
一.封装 封装 : 广义上的 :把一堆东西装在一个容器里 狭义上的 :会对一种现象起一个专门属于它的名字 函数和属性装到了一个非全局的命名空间 —— 封装 隐藏对象的属性和实现细节,仅对外提供公共访问 ...
- 面向对象 公有私有 property classmethod staticmethod
接口类(抽象类)--------就是一种规范 面向对象的私有与公有 对于每一个类的成员而言都有两种形式: 公有成员,在任何地方都能访问 私有成员,只有在类的内部才能方法 私有成员和公有成员的访问限制不 ...
- 【python】classmethod & staticmethod 区别
来源:http://blog.csdn.net/carolzhang8406/article/details/6856817 其他参考: http://blog.csdn.net/lovingprin ...
- python中@classmethod @staticmethod区别
Python中3种方式定义类方法, 常规方式, @classmethod修饰方式, @staticmethod修饰方式. class A(object): def foo(self, x): prin ...
- python笔记---@classmethod @staticmethod
python定义类方法的三种方式: 1.常规方式--需要通过self参数隐式的传递当前类对象的实例 2.@classmethod修饰方式--@classmethod修饰的方法class_foo()需要 ...
随机推荐
- React中控制台警告
1.dll_lib.js:1 Warning: bind(): You are binding a component method to the component. React does this ...
- R 包 rgl 安装失败, 报错 X11 not found but required, configure aborted 及解决方法
R 包 rgl 安装失败, X11 not found but required, configure aborted * installing *source* package ‘rgl’ ... ...
- Java 实现MD5加密
说到MD5,那我们首先要知道什么是MD5,开始吧 MD5的典型应用是对一段信息(Message)产生信息摘要(Message-Digest),以防止被篡改.比如,在UNIX下有很多软件在下载的时候都有 ...
- activemq的下载与安装
一.介绍 Apache ActiveMQ™是最流行的开源,多协议,基于Java的消息服务器.它支持行业标准协议,因此用户可以通过广泛的语言和平台获得客户选择的好处.可以使用C,C ++,Python, ...
- netty源码解解析(4.0)-19 ChannelHandler: codec--常用编解码实现
数据包编解码过程中主要的工作就是:在编码过程中进行序列化,在解码过程中从Byte流中分离出数据包然后反序列化.在MessageToByteEncoder中,已经解决了序列化之后的问题,ByteToMe ...
- javaio字节流复制文件夹
public class Copy1 { public static void main(String[] args) throws IOException { File src=new File(& ...
- windows下 ionic 打包app --以安卓版本为例
环境安装 1.nodejs 安装版本5.7,尽量不要安装太新的版本,因为可能会出现兼容性问题,一开始本人安装的是6.+的版本,后来出现问题的,马上换回5.7的,问题就不会出现了. 安装教程网上教程很多 ...
- linux 如何初始化密码(解决mysql root用户登录不了的问题)
这是我遇到的问题 然后就想这可能是mysql安全模式的问题,解决思路:首先改变mysql的安全模式及密码校验问题,jinrumysql后在更改用户名密码. 1.首先将my.ini中加入在[mysqld ...
- 玩转SpringBoot 2 之项目启动篇
SpringBoot 启动方式有那些? SpringBoot 有4种方式进行启动,具体方式如下: IDEA方式启动 Eclipse 方式启动 Maven 启动方式 通过SpringBoot 程序 ja ...
- [Python] Django框架入门
说明:Django框架入门 当前项目环境:python3.5.django-1.11 项目名:test1 应用名:booktest 命令可简写为:python manager.py xxx => ...