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
随机推荐
- CSS-禁止文本被选中
pc端: .not-select{ -moz-user-select:none; /*火狐*/ -webkit-user-select:none; /*webkit浏览器*/ -ms-user-sel ...
- 重磅消息,Micrium的uCOS全家桶将推出免费商业授权
说明: 1.预计将在下个月末的Embedded World 2020正式宣布开源免费商用. 2.uCOS全家桶一旦宣布免费商用,将给那些还在收费的RTOS带来一波冲击.其中最值的关注的是去年微软收购T ...
- docker - 启动不了docker服务
原因 因为docker是CS架构,Server方要配置好源,客户端才能连接,服务才能开启 解决办法 1.切换到root用户,su root.. 2.sudo vim /etc/docker/daemo ...
- leetcode菜鸡斗智斗勇系列(8)--- Find N Unique Integers Sum up to Zero
1.原题: https://leetcode.com/problems/find-n-unique-integers-sum-up-to-zero/ Given an integer n, retur ...
- Django框架之模板语言特殊标记(将后端的数据显示到前端)
后端代码 def GetMain(request): return render( request, "main.html", { "user1":" ...
- Bugku-CTF加密篇之ok(Ook!)
- POJ-1087 A Plug for UNIX (网络流)
思路 电器数1 ~ 100,附带100种接口,注意题目:You notice that some of the devices use plugs for which there is no rece ...
- vs2017 vs2019配置sqlite3连接引擎(驱动)指南(二)vs2019续集
在写完上一篇博客后,一觉醒来,又又又又不行了,介绍一个终极大招,如果你的fuck vs又提示无法打开sqlite3.h的问题 环境win10 vs2019 debug x86 实在没心情写文字了,直 ...
- python爬虫(八) requests库之 get请求
requests库比urllib库更加方便,包含了很多功能. 1.在使用之前需要先安装pip,在pycharm中打开: 写入pip install requests命令,即可下载 在github中有关 ...
- Copy-On-Write容器(转载)
Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改, ...