python原类、类的创建过程与方法
今天为大家介绍一下python中与class 相关的知识……
获取对象的类名
python是一门面向对象的语言,对于一切接对象的python来说,咱们有必要深入的学习与了解一些知识
首先大家都知道,要获取一个对象所对应的类,需要使用class来进行检索。
但如果我们只是一个简单的赋值语句,能这么使用么?让我们看下下面的代码:
num=10
string='abc'
class MainClass:
pass
p=MainClass()
print(num.__class__)
# output: <class 'int'>
print(string.__class__)
# output: <class 'str'>
print(p.__class__)
# output: <class '__main__.MainClass'>
通过上面的代码我们看到了,不论我们是简单的赋值操作,还是我们自己去定义一个类,并且通过这个类生成了一个对象。我们都可以使用__class__来查询对象所对应的方法。此处应该大多数人都是了解的。继续往下走
将我们眼中的类作为对象
刚才我们通过__class的方式获取了str、int、还有我们自定义的MainClass这三个类名。
但如果我们继续把他们作为对象,那么所对应的类是谁呢?让我们打印下
print(int.__class__) # 或者这么写:print(num.__class__.__class__)
# output: <class 'type'>
print(str.__class__)
# output: <class 'type'>
print(MainClass.__class__)
# output: <class 'type'>
class 'type' 这是一个什么鬼?
它叫原类,是创造其他类的类…
有人要问了,type就是祖宗了么?还有没有祖宗的祖宗?你可以自己验证啊,按照上面的方法
print(type.__class__)
output: <class 'type'>
这下死心了啊,type这个祖宗上面没有祖宗了。哈哈….
为什么是type
type这个函数我们经常会用到,比如一个对象,我们想知道它是什么类型的,那么我们会使用type(xxx)
那么type它到底是什么?看源码喽…
class type(object):
"""
type(object_or_name, bases, dict)
type(object) -> the object's type
type(name, bases, dict) -> a new type
"""
... ...
... ...
看到注释的时候我们明白了,type有两个用法
获取类型
创建新type
相信第一点,我们都经常用,否了解。
第二点是干嘛的?让我们留一个悬念,接着往下看
类的99.99%创建方法
所有人不管是java的还是Python的都明白,创建一个类么,class+类名 OK了
那么你知道你在class+类名,然后赋值或者定义实例方法的时候到底内存做了什么?
class MainClass:
name='Uranus'
这个方法应该是比pass高档一分钱不到的脑残类了。可你知道在内存中它做了什么么?
首先他创建了一个变量,变量的名字叫MainClass
之后python开辟了一块内存空间,用于创建一个类,类名为ClassMain
将ClassMain这个变量指向ClassMain
在这个方法中创建一个dict的字典
dict这个字典指向一个内存空间,存放着{name:Uranus}
和你们想的一样么?先不说一样不一样,估计很多人都要说我是瞎说的…没关系
介绍0.01%的类创建方法
刚才留了一个疑问,type的第二种用法,用来创建一个新的type
它是做什么的呢?让我先来演示一段代码
def func():
return 'is a function...'
# 重点在这里
TypeClass=type('MainClass1',(),{'name':'Uranus','func':func})
print(TypeClass.__class__)
# output: <class 'type'>
print(TypeClass)
# output: <class '__main__.MainClass1'>
print(TypeClass.__dict__)
# output: {'__module__': '__main__', '__weakref__': <attribute '__weakref__' of 'MainClass1' objects>, '__dict__': <attribute '__dict__' of 'MainClass1' objects>, '__doc__': None, 'func': <function func at 0x00000000024DDEA0>, 'name': 'Uranus'}
print(TypeClass.name)
# output: Uranus
print(TypeClass.func())
# output: is a function...
好了,现在告诉我,TypeClass是什么,是不是一个类?
我在type中做了什么,是不是创建类名,忽略父类,创建类属性,创建类的实例方法?
传统的class创建,知识将TypeClass这个变量名设置的和你的类名MainClass1一样而已
type的第二种方法你会了么?类的创建过程你明白了么?之前你会么?双击666吧!
The End
OK,今天的内容就到这里,如果觉得内容对你有所帮助,可以点击文章右下角的“在看”。
欢迎将这篇文章或我的微信公众号【清风Python】分享给更多喜欢python的人,谢谢。
作者:清风Python
python原类、类的创建过程与方法的更多相关文章
- 细说python类3——类的创建过程
细说python类3——类的创建过程 https://blog.csdn.net/u010576100/article/details/50595143 2016年01月27日 18:37:24 u0 ...
- 【原创】Python 对象创建过程中元类, __new__, __call__, __init__ 的处理
原始type: type是最原始的元类,其__call__方法是在你使用" t_class = type(classname_string, base_classes_tuple, attr ...
- 类和对象的创建过程(元类,__new__,__init__,__call__)
一. type() 1.创建类的两种方式 方式一 class MyClass(object): def func(self,name): print(name) myc = MyClass() pri ...
- python 通过元类控制类的创建
一.python中如何创建类? 1. 直接定义类 class A: a = 'a' 2. 通过type对象创建 在python中一切都是对象 在上面这张图中,A是我们平常在python中写的类,它可以 ...
- 深入理解Java对象的创建过程:类的初始化与实例化
摘要: 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类 ...
- python之定义类创建实例
https://www.cnblogs.com/evablogs/p/6688938.html 类的定义 在Python中,类通过class关键字定义,类名以大写字母开头 1 2 >>&g ...
- python用类的方式创建线程---自创建类
用类的方式创建线程---自创建类 import threadingimport time class MyThread(threading.Thread):#自建MyThread类继承threadin ...
- Java对象的创建过程:类的初始化与实例化
一.Java对象创建时机 我们知道,一个对象在可以被使用之前必须要被正确地实例化.在Java代码中,有很多行为可以引起对象的创建,最为直观的一种就是使用new关键字来调用一个类的构造函数显式地创建对象 ...
- Python 如何管理类的创建行为
问题 如果我们要给类加上一个属性,只需在定义的时候加上属性就可以了: class Animal: can_fly = True 如果这样的类有很多,我们可以定义一个父类,让其它类继承他就可以了: cl ...
随机推荐
- 网络安全-主动信息收集篇第二章-二层网络扫描之scapy
scapy是python第三方库文件,可以使用python进行调用也单独进行使用. 非常强大可以用于抓包.分析.创建.修改.注入网络流量. 使用scapy 详细使用方式可以查看github:https ...
- canvas绘制工作流之绘制节点
上一篇我们介绍了canvas绘制工作流的大概步骤,接下来会有系列文章细致的介绍怎么用canvas绘制工作流:这篇文章主要介绍用canvas绘制流程节点. 绘制前我们需要先准备一张节点图片,例如::好了 ...
- 使用客户机和主机做DNS服务正向解析及小问题解决
1.下载yum包 命令:yum install bind-chroot 2.更改配置文件 在这里,要了解到主配置文件为: /etc/named.conf 但是,为了避免经常修改主配置文件named ...
- MySQL原生PHP操作-天龙八步
<?php //1.第一步[建立连接] $conn = mysqli_connect('localhost','root','123456') or die('数据库连接失败!'); //2.第 ...
- 致和我一样迷茫的Java程序员们
缘起 从事近7年Java开发之后,在2019年这个寒冷的冬天里,我终于迎来了人生中的第一次裁员. 啊,30岁之后的裁员真让人焦虑. 按照以往惯例,在面试心仪的公司之前,需要先面试一些不那么心仪的公司热 ...
- Spring注解@Configuration是如何被处理的?
从SpringApplication开始 一般情况下启动SpringBoot都是新建一个类包含main方法,然后使用SpringApplication.run来启动程序: @SpringBootApp ...
- [Bootstrap] Bootstrap学习笔记
1.因为bootstrap用到了html5的特性,为了正常使用,需要在最开头加上<!DOCTYPE html> 2.Bootstrap需要JQuery才能正常工作,所以需要导入jquery ...
- Ubuntu 18 安装搜狗输入法
Ubuntu 18 安装搜狗输入法: 1. 搜狗输入法官网下载对应的Linux输入法 2. 双击 刚刚下载好的 deb 文件 3. 点击 install(安装) 4. 在 settings(系统设置) ...
- linux命令--文件目录操作命令
一.命令的基本格式 1.命令提示符 [root@love2 ~]# []:这是提示符的分隔符号,没有特殊含义. root:显示的是当前的登录用户. @:分隔符号,没有特殊含义.love2:当前系统的主 ...
- var与let与const
var与let与const都是用来声明变量,但是三者之间也有一些区别 var的使用 var a;//声明变量a var a,b,c;//声明三个变量a,b,c var a,b,c=2;//声明了三个变 ...