一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法

而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用

classmethodstaticmethod都是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的更多相关文章

  1. classmethode,staticmethode、反射

    目录 classmethod: staticmethod: classmethod与staticmethod都是python解释器内置的装饰器 类中定义的函数分为两大类:绑定方法和非绑定方法 在类中正 ...

  2. OAF_OAF控件系列9 - Description Flexfiled描述性弹性域的实现(案例)

    2014-06-17 Created By BaoXinjian

随机推荐

  1. 行内元素的上下margin 和 img元素的上下margin

    行内元素的特点有: 1.与其他元素在同一行 2.宽度(width).高度(height).内边距的top/bottom(padding-top/padding-bottom)和外边距的top/bott ...

  2. C++实现对MySQL数据库的连接,以及增删改查

    安装好MySQL,建好数据表的前提下. 如果只是想简单实现添加数据或者其他一个操作数据,可以参考另一篇博客. https://www.cnblogs.com/ming-4/p/11544514.htm ...

  3. 「BJWC2010」模板严格次小生成树

    题目描述 小 \(C\) 最近学了很多最小生成树的算法,\(Prim\) 算法.\(Kruskal\) 算法.消圈算法等等.正当小\(C\)洋洋得意之时,小\(P\)又来泼小\(C\)冷水了.小\(P ...

  4. 【笔记5-购物车及地址模块】从0开始 独立完成企业级Java电商网站开发(服务端)

    购物车模块 数据库表设计 购物车表 CREATE TABLE mmall_ cart ( 'id' int(11) NOT NULL AUTO_ INCREMENT, 'user_ id' int(1 ...

  5. 2_1 aabb

    输出所有形如aabb的4位完全平方数(即前两位数字相等,后两位数字也相同).

  6. WinForm开发(2)——DataGridView控件(2)——C# dataGridview控件,怎么获取行数

    dataGridView1.Rows.Count;//所有行数dataGridView1.RowCount;//可见行数

  7. Nexus-配置VDC

    1.配置资源模板This example shows how to configure a VDC resource template: vdc resource template TemplateA ...

  8. 一、FreeMarker实现对js和css压缩

    1.代码压缩理解:实际上就是将原有的文本中无用的注释.空行.空格去掉来压缩文件的大小.进行js和css压缩会带来如下好处:1)减小了文件的体积,减少文件占用的内存;2)减小了网络传输量和带宽占用; 3 ...

  9. msbuild发布web应用程序

    aspnet_compiler.exe 只能编译 网站,web应用程序项目使用下面的命令即可. msbuild C:\Jenkins\jobs\KM_ERP_WEBAPP\workspace\KMWe ...

  10. springboot默认创建的bean是单实例

    默认是单例 通过注解@Scope("prototype"),将其设置为多例模式 参考: 曾经面试的时候有面试官问我spring的controller是单例还是多例,结果我傻逼的回答 ...