type简介

type在Python中的作用是创建一个类。

我们创建类的时候一般会使用这样的方法:

# -*- coding:utf-8 -*-

class Student(object):

    country = "China"

    def add(self,x:int,y:int)->int:
return x+y s1 = Student()
print(s1.country)
print(s1.add(12,23))

当然也可以使用type方法创建类,效果与上面的方法一样:

# -*- coding:utf-8 -*-
Student = type(
"Student",
# 元组只有单个元素后面需要加逗号!
(object,),
{
'country':"China",
'add':lambda self,x,y:x+y
}
) s1 = Student()
print(s1.country)
print(s1.add(12,33))

不过,我最近看公司某个封装好的功能的源码的时候,发现了它另外的一个用途,就是“在对象方法中调用类方法”(什么,你分不清对象方法、类方法与静态方法?请自行Google)。

在对象方法中使用类方法

基本操作

假设我们现在有一个Student类,要在对象方法中调用类方法,可以这样写:

# -*- coding:utf-8 -*-
class Student(object): @classmethod
def get_country(cls):
return "China"
def __init__(self,name):
self.name = name
# type(self),在对象方法中使用类的方法
self.country = type(self).get_country()
def get_my_country(self):
# type(self),在对象方法中使用类的方法
return type(self).get_country()
if __name__ == '__main__': s1 = Student('wanghw') print(s1.country) # China
print(s1.get_my_country()) # China # 事实上,对象也可以直接调用“类方法”,但是为了“规范”,我们不这么直接让对象直接调用“类方法”
print(s1.get_country()) # China

起一个与类方法同名的对象方法再试试

上面的基本操作也许大家都明白,现在我们试一下极端的方式:起一个与类方法同名的对象方法,看看效果如何:

# -*- coding:utf-8 -*-
class Student(object): @classmethod
def get_country(cls):
return "China" def __init__(self,name):
self.name = name
# type(self),在对象方法中使用类的方法
self.country = type(self).get_country() def get_my_country(self):
# type(self),在对象方法中使用类的方法
return type(self).get_country() # 起一个与类方法同名的对象方法
def get_country(self):
return "English"
if __name__ == '__main__': s1 = Student('wanghw') print(s1.country)
print(s1.get_my_country())

运行程序,你会发现上报了一个这样的错误:

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

实际上,此时我们实例化的Student对象用的是自己的方法!而上面的__init__初始化方法与get_my_country方法的调用者是类Student,缺少了参数self,我们把程序修改如下(在get_country中加上参数self再试试):

# -*- coding:utf-8 -*-
class Student(object): @classmethod
def get_country(cls):
return "China" def __init__(self,name):
self.name = name
# type(self),在对象方法中使用类的方法
self.country = type(self).get_country(self) def get_my_country(self):
# type(self),在对象方法中使用类的方法
return type(self).get_country(self) # 起一个与类方法同名的对象方法
def get_country(self):
return "English" if __name__ == '__main__': s1 = Student('wanghw') print(s1.country) # English
print(s1.get_my_country()) # English

由此,我们可以得出结论:如果对象方法与类方法同名的话,对象会优先调用自己的方法!

其他相关的知识点详见这篇博客

其他关于type的说明,我自己之前总结过一篇关于type与isinstance的区别的文章,还有我在网上找的一篇很不错的关于type的说明的文章:

https://www.cnblogs.com/paulwhw/p/10637282.html

https://www.cnblogs.com/zy0517/articles/9046549.html

使用type在对象方法中调用类方法的更多相关文章

  1. Delphi动态事件深入分析(对象方法在调用的时候会传递一个隐含的Self指针,而该指针的值在EAX中。即左边第一个参数)

    Delphi动态事件深入分析 2009-2-7 作者:不得闲核心提示:本实验证明了在类中方法的调用时候,所有的方法都隐含了一个Self参数,并且该参数作为对象方法的第一个参数传递... 首先做一个空窗 ...

  2. Java中对象方法的调用过程&动态绑定(Dynamic Binding)

    Java面向对象的最重要的一个特点就是多态, 而多态当中涉及到了一个重要的机制是动态绑定(Dynamic binding). 之前只有一个大概的概念, 没有深入去了解动态绑定的机理, 直到很多公司都问 ...

  3. Java-main方法中调用非static方法

    java的calss中,在public static void main(String[] args) { }方法中调用非static的方法:在main方法中创建该calss的对象,用对象调用非sta ...

  4. springMVC在普通方法中调用service方法

    SpringContextUtil类 package com.common.util; import org.springframework.beans.BeansException;import o ...

  5. JAVA Main方法中调用非静态方法

    在JAVA中静态方法中只能调用其他,静态方法.main方法都是静态方法,如果想调用其它的方法,要么只能是其它的静态方法.还有一种方法就是将当前类实例化在调用它的非静态方法 public class t ...

  6. 动态的创建Class对象方法及调用方式性能分析

    有了Class对象,能做什么? 创建类的对象:调用Class对象的newInstance()方法 类必须有一个无参数的构造器. 类的构造器的访问权限需要足够. 思考?没有无参的构造器就不能创建对象吗? ...

  7. 为什么Java中 wait 方法需要在 synchronized 的方法中调用?

    另一个棘手的核心 Java 问题,wait 和 notify.它们是在有 synchronized 标记的方法或 synchronized 块中调用的,因为 wait 和 modify 需要监视对其上 ...

  8. JS高级 —— 普通函数、构造函数、对象方法的调用

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  9. javascript中string对象方法中的slice、substring、substr的区别联系

    1.slice.substring.snustr均属于String的对象方法,用于截取或提取字符串片段,三者均布破坏原先的字符串,而是以新的字符串返回被提取的部分. <script> va ...

随机推荐

  1. C++新型强制类型转换。

    C++强制类型转换分为4个不同的类型. 1.static_cast -用作基本类型转换. -不能用于基本类型指针转换. -可以用于有继承关系对象之间的转换和类指针之间的转换. #include < ...

  2. Linux使用fsck修复文件系统

      1.fsck---file system check fsck 扫描文件系统时一定要在单用户模式.修复模式或把设备umount后进行.如果扫描运行中的系统,会造成系统文件损坏. RHEL6中fsc ...

  3. GPT-2,吓坏创造者的「深度造假写手」

    简评: 今年二月份刷屏的 GPT-2 着实厉害,那个生成续写故事的例子更是效果好到吓人一跳,它到底有多厉害,本文略微讲讲.更详细的信息可参考文末 OpenAI 的博客链接. 你能从下面这两段文字里品味 ...

  4. BufferedReader和PrintWriter读写中文的问题

    最近用BufferedReader读一个文本文件,然后再将读出的内容用PrintWriter写入到另外一个新的文件中. 之前一直没有发现这个问题,就是如果文本内容中有中文,在读出的内容和写入的内容都会 ...

  5. Java JDK下载方法

    https://jingyan.baidu.com/album/574c5219fb033c2c8d9dc194.html?picindex=5  也可以参考这个 ‘’‘’ 大家下载的时候一定要按照步 ...

  6. 【洛谷P1919】A*B Problem升级版

    题目大意:rt 题解:将长度为 N 的大整数看作是一个 N-1 次的多项式,利用 FFT 计算多项式的卷积即可. 代码如下 #include <bits/stdc++.h> using n ...

  7. Redis(一)

    1 单机MySQL的美好时代2 Memcached(缓存)+MySQL+垂直拆分3 MySQL主从读写分离4 分库分表+水平拆分+mysql拆分5 MySQL的扩展瓶颈6 为什么使用NoSQLNoSQ ...

  8. HBase(1.0.2) API数据模型

    几个相关类与HBase数据模型之间的对应关系 java类 HBase数据模型 HBaseAdmin 数据库(DataBase) HBaseConfiguration HTable 表(Table) H ...

  9. python学习理论

    结论 其实学python这本书 不一定要全部敲一遍 在“”动手试一试“”里面 把这篇学到的东西测试一下就算是掌握了 要在实际工作场景当中使用还需要进一步练习这样做的话 比较好一点 边学边测试 加深掌握 ...

  10. maven项目解决pom.xml头部 http://maven.apache.org/xsd/maven-4.0.0.xsd报错的问题

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/qq_36611526/article/d ...