一、classmethod介绍

介绍:@classmethod修饰符我们从名称就可以知道,这是一个类方法,那么和普通的类中的方法有什么不同的

a、类方法,是由类本身调用的,无需实例化类,直接用类本身调用即可,但是要注意实例对象也可以调用类方法

b、类方法,无需要要一个self参数,这个self参数表示类的实例对象,但是他需要一个cls参数,这个参数表示类本身

c、类方法,可以调用类的属性,类的方法,类的实例对象

下面我们正常进入介绍classmethod这个修饰符

1、类方法可以由类调用,也可以由实例对象调用

class Test(object):
n = 1 def func1(self):
return self.n @classmethod
def func2(cls):
return cls.n a = Test() # 类调用类方法
b = Test.func2() # 实例对象调用类方法
c = a.func2() print(b,c)

可以正常运行,说明类方法可以被类调用,也可以被实例对象调用

2、未被classmethod修饰的方法可以被类调用,但是要传递一个实例对象给实例方法

先看一个错误的例子,由类去调用普通的类的方法,不传递一个实例对象,会报错

class Test(object):
n = 1 def func1(self):
return self.n @classmethod
def func2(cls):
return cls.n # a = Test() t = Test.func1()

错误如下

TypeError: func1() missing 1 required positional argument: 'self'

下面在看下正确的例子

由类去调用普通的类的方法,但是传递一个实例对象给类的普通的方法

class Test(object):
n = 1 def func1(self):
return self.n @classmethod
def func2(cls):
return cls.n a = Test() t = Test.func1(a)

可以正常输出结果

3、类的方法可以调用类的属性

在类的方法中调用类的属性是可以的

class Test(object):
n = 1 def func1(self):
return self.n @classmethod
def func2(cls):
# 在类方法中,可以调用类的属性
return cls.n

4、在类的方法中调用类的方法

类方法中调用类方法是可以的

class Test(object):
n = 1 def func1(self):
return self.n @classmethod
def func2(cls):
# 在类方法中,可以调用类的属性
cls.func3()
return cls.n @classmethod
def func3(cls):
print("我是一个被调用的类方法")

5、实例方法中调用类方法

在实例方法中调用类的方法也是可以的

class Test(object):
n = 1 def func1(self):
# 在实例方法中调用类的方法
Test.func3()
return self.n @classmethod
def func2(cls):
# 在类方法中,可以调用类的属性
cls.func3()
return cls.n @classmethod
def func3(cls):
print("我是一个被调用的类方法") a = Test()
a.func1()

二、__getattr__介绍

这个方法是类中的一个方法,如果我们实例化这个类,通过类的实例对象打印一个一个不存在的属性,则会执行__getattr__这个方法

class test_attr(object):
def __init__(self,name):
self.name = name def test(self):
return self.name def __getattr__(self, item):
s = str(item) + "+" + str(self.name)
return s

然后我们来实例化类,然后执行

a = test_attr("dsb")

print(a.sdb)

print(a.name)

结果如下

sdb+dsb
dsb

分析

我们看到类本身没有sdb这个属性,但是有name这个属性

通过实例对象调用sdb,如果没有__getattr__这个方法就会报错,如果有这个方法,就会把sdb这个当做一个字符串传递给__getattr__这个方法,并赋值给item,然后执行__getattr__z这个方法

通过实例对象调用name这个属性,因为实例对象有name这个属性,所以就不会走__getattr__这个方法

大家明白了这个类方法的作用了吗?

Python面向对象中的classmethod类方法和__getattr__方法介绍的更多相关文章

  1. Python面向对象中的“私有化”

    Python面向对象中的“私有化” Python并不直接支持私有方式,而要靠程序员自己把握在外部进行特性修改的时机. 为了让方法或者特性变为私有(从外部无法访问),只要在它的名字前面加上双下划线即可. ...

  2. Python面向对象中的继承、多态和封装

    Python面向对象中的继承.多态和封装 一.面向对象的三大特性 封装:把很多数据封装到⼀个对象中,把固定功能的代码封装到⼀个代码块, 函数,对象, 打包成模块. 这都属于封装思想. 继承:⼦类可以⾃ ...

  3. 第8章 Python类中常用的特殊变量和方法目录

    第8章 Python类中常用的特殊变量和方法 第8.1节 Python类的构造方法__init__深入剖析:语法释义 第8.2节 Python类的__init__方法深入剖析:构造方法案例详解 第8. ...

  4. 第8.34节 《Python类中常用的特殊变量和方法》总结

    本章介绍了Python类中常用的特殊变量和方法,这些特殊变量和方法都有特殊的用途,是Python强大功能的基石之一,许多功能非常有Python特色.由于Python中一切皆对象,理解这些特殊变量和方法 ...

  5. Python中异步协程的使用方法介绍

    1. 前言 在执行一些 IO 密集型任务的时候,程序常常会因为等待 IO 而阻塞.比如在网络爬虫中,如果我们使用 requests 库来进行请求的话,如果网站响应速度过慢,程序一直在等待网站响应,最后 ...

  6. ORACLE PL/SQL 中序列(sequence)的简易使用方法介绍

    如果我是C罗 原文 ORACLE PL/SQL 中序列(sequence)的简易使用方法介绍 sequence在ORACLE中应用十分广泛,就是序列号的意思,会自动增加指定变数,如逐次增加1或者2或者 ...

  7. python 类中staticmethod,classmethod,普通方法

    1.staticmethod:静态方法和全局函数类似,但是通过类和对象调用. 2.classmethod:类方法和类相关的方法,第一个参数是class对象(不是实例对象).在python中class也 ...

  8. Python面向对象中super用法与MRO机制

    1. 引言 最近在研究django rest_framework的源码,老是遇到super,搞得一团蒙,多番查看各路大神博客,总算明白了一点,今天做一点总结. 2. 为什么要用super 1)让代码维 ...

  9. python ——面向对象进阶(反射,双下线方法,静态方法,类方法)

    属性 如果你已经了解Python类中的方法,那么属性就非常简单了,因为Python中的属性其实是普通方法的变种. 哎,其实就是这样,我们看一下当我们想查看税后工资的时候,这其实是一个人的属性,但是它却 ...

随机推荐

  1. 生产redis client 链接报:ERR max number of clients reached 含义: 达到最大客户端数错误

    1.通过netstat 命令查看TCP又11822个连接  (netstat命令是一个监控TCP/IP网络的非常有用的工具) 2.默认redis最大的连接数10000 ,但是此时无法连接redis客户 ...

  2. PythonStudy——字符编码 Character Encoding

    测试一下学习字符编码的问题:解决乱码问题 数据 从 硬盘 => 内存 => cpu应用程序打开文本文件的三步骤1.打开应用程序2.将数据加载到内存中3.cpu将内存中的数据直接翻译成字符显 ...

  3. [转]SQL server2008 导入超大SQL脚本文件(超过10M)

    同事给我一个sqlserver的学习库,sql脚本导出有300m,gui执行有内存溢出的错误报出来,所以问了一下度娘,学而时习之:) 1. SQL server2008 导入超大SQL脚本文件(超过1 ...

  4. ionic3安卓平台引用高德地图

    1.前置条件 第一步,注册高德开发者:第二步,去控制台创建应用:第三步,获取Key. 2.打开src目录下的index.html, 在head标签中添加以下代码,引入js: <script ty ...

  5. C#编程经验-VS Debug

    F11 OneStepDebugF10 ProcessDebugbreakPointDebug(quick location,then use one step debug)

  6. Excel 二维数组(数据块)旋转/翻转技巧

    Excel 二维数组(数据块)旋转/翻转技巧 原创 2017-12-30 久石六 久石六 工作中遇到个问题,需要将Excel中的数据块或者说二维数组向右旋转90度,才能再加工处理.当然,不是旋转文本方 ...

  7. FileProvider相关 Failed to find configured root that contains

    问题: 使用FileProvider构造SD卡中文件uri时异常 java.lang.IllegalArgumentException: Failed to find configured root ...

  8. Centos7在单用户模式下重置root密码

    1.启动Centos7 ,按空格让其停留在如下界面: 鼠标上下可以选择启动内核,默认选择第一个内核开机 2.按e键进入编辑模式 e 按下e键后我们可能无法看到我们需要编辑的区域,这是因为在较新版本的C ...

  9. [转]IIS 日志记录时间和实际时间 不一样

    今天偶然发现 2003 系统IIS 日志记录时间和实际时间总是差了8个小时,也就是慢了8个小时.苦苦找了半天才发现如下办法能解决 ,特发来分享下 解决1:如果 IIS日志记录默认使用的是W3C扩展日志 ...

  10. List 的add()与addAll()的区别

    add 是将传入的参数作为当前List中的一个Item存储,即使你传入一个List也只会另当前的List增加1个元素addAll 是传入一个List,将此List中的所有元素加入到当前List中,也就 ...