classmethode,staticmethode
一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法
而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用
classmethod与staticmethod都是python解释器内置的装饰器
类中定义的函数分为两大类:绑定方法和非绑定方法
在类中正常定义的函数默认是绑定到对象的,而为某个函数加上装饰器@classmethod后,该函数就绑定到了类。
classmethod:
是一个装饰器,给类内部定义方法的装饰,将类内部的方法变为 “类的绑定方法”。
classmethod 修饰符对应的函数不需要实例化,不需要 self 参数
但第一个参数参数 需要是表示自身类的 cls 参数,该参数名一般约定为“cls”,通过它来传递类的属性和方法
调用: 可以用类名直接调用
绑定到类的方法就是专门给类用的,但其实对象也可以调用,只不过自动传入的第一个参数仍然是类,也就是说这种调用是没有意义的,并且容易引起混淆
示例
class A(object):
bar = 1
def func1(self):
print ('foo')
@classmethod
def func2(cls):
print ('func2')
print (cls.bar)
cls().func1() # 调用 foo 方法
A.func2() # 不需要实例化
输出结果
输出结果:
func2
1
foo
staticmethod:
静态方法 是一个装饰器,给在类内部定义方法中装饰,将类内部的方法变为 “非绑定方法”。
静态方法没有类似 self、cls 这样的特殊参数,因此 Python 解释器不会对它包含的参数做任何类或对象的绑定,也正是因为如此,此方法中无法调用任何类和对象的属性和方法,静态方法其实和类的关系不大;就像正常调用函数一样
实例对象和类对象都可以调用。
在使用 Python 编程时,一般不需要使用类方法或静态方法,程序完全可以使用函数来代替类方法或静态方法
import uuid
class MySQL:
def __init__(self,host,port):
self.id=self.create_id()
self.host=host
self.port=port
@staticmethod
def create_id():
return uuid.uuid1()
>>> conn=MySQL(‘127.0.0.1',3306)
>>> print(conn.id) #100365f6-8ae0-11e7-a51e-0088653ea1ec
# 类或对象来调用create_id发现都是普通函数,而非绑定到谁的方法
>>> MySQL.create_id
<function MySQL.create_id at 0x1025c16a8>
>>> conn.create_id
<function MySQL.create_id at 0x1025c16a8>
总结:
对象的绑定方法:
- 由对象来调用,由谁来调用,会将谁(对象)当做第一个参数传入。
类的绑定方法:
- 由类来调用,由谁来调用,会将谁(类)当做第一个参数传入。
非绑定方法:
- 可以由对象或类来调用,谁来调用都是一个普通方法(普通函数),方法需要传入几个参数,就得传入几个。
总结绑定方法与非绑定方法的使用:若类中需要一个功能,该功能的实现代码中需要引用对象则将其定义成对象方法、需要引用类则将其定义成类方法、无需引用类或对象则将其定义成静态方法。
classmethode示例
classmethod_Demo:
class DB:
__data = 'tank is very handsome!!!'
def __init__(self, user, pwd, role):
self.user = user
self.pwd = pwd
self.role = role
# @classmethod
# def init(cls, user, pwd, role): # cls --》指的是类
# # 在类方法内部调用类产生一个实例 ---》 对象
# return cls(user, pwd, role)
# 查看数据方法
@classmethod
def check_db(cls, user, pwd, role): # cls --》指的是类
# 在类方法内部调用类产生一个实例 ---》 对象
obj = cls(user, pwd, role)
# 1.查看数据前,必须要通过校验
if obj.user == 'tank' and obj.pwd == '123' and obj.role == 'admin':
print('检验通过..')
print(cls.__data)
return cls.__data
DB.check_db('tank', '123', 'admin')
# db_obj = DB('tank', '123', 'admin')
# db_obj.check_db()
# __class__: 查看当前对象的类
# print(db_obj.__class__)
staticmethode示例
class Foo:
@staticmethod
def func(res):
print(res)
obj = Foo()
# 对象调用非绑定方法
obj.func(123)
# 类调用非绑定方法
Foo.func(1234)
classmethode,staticmethode的更多相关文章
- classmethode,staticmethode、反射
目录 classmethod: staticmethod: classmethod与staticmethod都是python解释器内置的装饰器 类中定义的函数分为两大类:绑定方法和非绑定方法 在类中正 ...
- OAF_OAF控件系列9 - Description Flexfiled描述性弹性域的实现(案例)
2014-06-17 Created By BaoXinjian
随机推荐
- php 用mysqli的json_encode()转换出来 全是对象的问题
<?php /** * Created by PhpStorm. * User: Administrator * Date: 2018/9/6 0006 * Time: 15:33 */ //查 ...
- velocity的 ${} 、$!{}、 !${}
${abc} //-------过滤变量中的HTML标签 $!{abc} //-------原样输出表达式,"!"符号表示如果可以取到值则显示值,如果取不到值或值为null, ...
- 【硬核教程】只需1秒—你也可以有自己的API文档
Nothing is true. Everything is permitted. 写在前面 先聊聊为什么想到了要用Vuepress来代替原来写在Confluence上的文档. 大意是有个需要其他部门 ...
- CSS - px、em、%
px(像素).em.% 百分比 1. em 1.1 本元素给定字体的 font-size 值,如果元素的 font-size 为 14px ,那么 1em = 14px:如果 font-size 为 ...
- Steam 游戏 《Sudoku Universe(数独宇宙)》——[数独基本局分析]
日期:2020.02.12 博客期:152 星期三 老师给的任务都做完了,15篇博客也都写好了,剩下的几天居然还要每天写一篇~唉~为难我 PH ,剩下的几天就把 我的数独要义分享一下吧! 1.基本局规 ...
- CSS:定位概述
background-position 背景定位 如果,说浮动, 关键在一个 "浮" 字上面, 那么 我们的定位,关键在于一个 "位" 上. PS: 定位是我们 ...
- Docker for YApi--一键部署YApi
获取YApi镜像$ docker pull mrjin/yapi:latest 注意:本仓库目前只支持安装,暂不支持升级,请知晓.如需升级请备份mongoDB内的数据. docker-compose ...
- LinkQueue(链队)
今天学习了队列,因为前面写了好几个链表实现的数据结构基本上都懂了,然后大致了解了一下队列的特点,便决定用自己的理解来实现一个,然后实现了. (2018-02-14 代码更新) Head file: # ...
- 测量设备自动化-AK协议
1.AK协议定义 AK协议是控制器和测量设备之间通信的方式,广泛应用于整车耐久转毂等测试中,如AVL VECON.人们通常都是用VECON界面设置试验曲线,但通过AK可以实现设备的自动化.如下图所示: ...
- Day11 - D - Race to 1 Again LightOJ - 1038
设dp_i为所求答案,每次选择因数的概率相同,设i有x个因数,dp_i=sum(1/x*x_j)+1,(x_j表示第j个因数),那我们就预处理每个数的因数即可,T=10000,需要预处理出答案 #in ...