Python面向对象中的classmethod类方法和__getattr__方法介绍
一、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__方法介绍的更多相关文章
- Python面向对象中的“私有化”
Python面向对象中的“私有化” Python并不直接支持私有方式,而要靠程序员自己把握在外部进行特性修改的时机. 为了让方法或者特性变为私有(从外部无法访问),只要在它的名字前面加上双下划线即可. ...
- Python面向对象中的继承、多态和封装
Python面向对象中的继承.多态和封装 一.面向对象的三大特性 封装:把很多数据封装到⼀个对象中,把固定功能的代码封装到⼀个代码块, 函数,对象, 打包成模块. 这都属于封装思想. 继承:⼦类可以⾃ ...
- 第8章 Python类中常用的特殊变量和方法目录
第8章 Python类中常用的特殊变量和方法 第8.1节 Python类的构造方法__init__深入剖析:语法释义 第8.2节 Python类的__init__方法深入剖析:构造方法案例详解 第8. ...
- 第8.34节 《Python类中常用的特殊变量和方法》总结
本章介绍了Python类中常用的特殊变量和方法,这些特殊变量和方法都有特殊的用途,是Python强大功能的基石之一,许多功能非常有Python特色.由于Python中一切皆对象,理解这些特殊变量和方法 ...
- Python中异步协程的使用方法介绍
1. 前言 在执行一些 IO 密集型任务的时候,程序常常会因为等待 IO 而阻塞.比如在网络爬虫中,如果我们使用 requests 库来进行请求的话,如果网站响应速度过慢,程序一直在等待网站响应,最后 ...
- ORACLE PL/SQL 中序列(sequence)的简易使用方法介绍
如果我是C罗 原文 ORACLE PL/SQL 中序列(sequence)的简易使用方法介绍 sequence在ORACLE中应用十分广泛,就是序列号的意思,会自动增加指定变数,如逐次增加1或者2或者 ...
- python 类中staticmethod,classmethod,普通方法
1.staticmethod:静态方法和全局函数类似,但是通过类和对象调用. 2.classmethod:类方法和类相关的方法,第一个参数是class对象(不是实例对象).在python中class也 ...
- Python面向对象中super用法与MRO机制
1. 引言 最近在研究django rest_framework的源码,老是遇到super,搞得一团蒙,多番查看各路大神博客,总算明白了一点,今天做一点总结. 2. 为什么要用super 1)让代码维 ...
- python ——面向对象进阶(反射,双下线方法,静态方法,类方法)
属性 如果你已经了解Python类中的方法,那么属性就非常简单了,因为Python中的属性其实是普通方法的变种. 哎,其实就是这样,我们看一下当我们想查看税后工资的时候,这其实是一个人的属性,但是它却 ...
随机推荐
- paramiko模块(01-04节)、SSH
1. SSH(安全外壳协议) SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定:SSH 为建立在应用层基础上的安全协议.SS ...
- cordova文件传输系统插件使用:cordova-plugin-file-transfer
1. 添加插件:cordova plugin add cordova-plugin-file-transfer 2. 调用方法: var fileTransfer = new FileTransfer ...
- 什么是web前端开发?
Web前端开发工程师,主要职责是利用(X)HTML/CSS/JavaScript/Flash等各种Web技术进行客户端产品的开发.完成客户端程序(也就是浏览器端)的开发,开发JavaScript以及F ...
- 第一章 C#入门 (Windows窗体应用程序)(三)
[案例] 编写一个Windows窗体应用程序,窗体上有一个文本框和两个按钮([显示]和[清除]按钮). 单击[显示]时,文本框的背景变为蓝色并且居中显示“努力学习C#”: 单击[清除]按钮,文本框的背 ...
- 在 delphiXE 10.2 上安装 FR5.4.6
今天在虚拟机里成功安装了delphiXE 10.2, 然后想把常用的FR也装上,本想偷个懒,在网上找个装上就得了,结果发现必须要在发布的网站注册才能下载⊙︿⊙ 如此麻烦,心里这个不爽啊不爽! 然后自己 ...
- MySQL Point in Time Recovery the Right Way
In this blog, I’ll look at how to do MySQL point in time recovery (PITR) correctly. Sometimes we nee ...
- 12月中旬项目中出现的几个bug解决方法的思考
这周做的项目遇到2个费了很多时间才解决的bug,解决之后,发现根本问题并不是什么很难的技术难点,都是因为自己在写代码的过程中,思维不够清晰.还有一个需要再提高的地方就是解决问题的思维,如何快速定位到问 ...
- IIC时序详解
Verilog IIC通信实验笔记 Write by Gianttank 我实验的是 AT24C08的单字节读,单字节写,页读和页写,在高于3.3V系统中他的通信速率最高400KHZ的,我实验里用的是 ...
- Numpy学习笔记(二)
(1)NumPy - 切片和索引 l ndarray对象中的元素遵循基于零的索引. 有三种可用的索引方法类型: 字段访问,基本切片和高级索引. l 基本切片 Python 中基本切片概念到 n 维 ...
- JAVA使用log4j(另SSM框架中使用log4j)
1.引入jar包 log4j-1.2.13.jar 2.src下建立配置文件:log4j.properties #不+All,只写后一种LOG log4j.rootLogger =ALL,system ...