春雪玉娇传奇 發表於 2019-6-18 19:38:00

Python中type()详解:动态创建类

<svg xmlns="http://www.w3.org/2000/svg" style="display: none">
            <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0)"></path>
            </svg>
            <p>众所周知:<br>
type()函数可以查看变量的类型:<br>
先看一个简单的列子来看一下type查看变量类型</p>
<pre><code>class Animal():
    pass

a=Animal()
print(type(a))
print(type(Animal))
   
&lt;class '__main__.Animal'&gt;
&lt;class 'type'&gt;
</code></pre>
<p>可以发现我定义的Animal类本身的类型是 type</p>
<p>从 Python 解释器的角度来看,当程序使用 class 定义 Animal 类时,也可理解为定义了一个特殊的对象(type 类的对象),并将该对象赋值给 Animal变量。因此,程序使用 class 定义的所有类都是 type 类的实例。</p>
<p>实际上 Python 完全允许使用 type() 函数(相当于 type 类的构造器函数)来创建 type 对象,又由于 type 类的实例就是类,因此 Python 可以使用 type() 函数来动态创建类<br>
正常情况下类的创建及实例化调用</p>
<pre><code>class Test():
    name = "Test"
    def hello(self):
      print("hello world")

t = Test()
t.hello()#Test.hello(t)
print(t.name)
</code></pre>
<p>而使用type()动态创建类:</p>
<pre><code>def hello(self):
    self.name = 10
    print("hello world")

t = type("hello",(),{"a":1,"hello":hello})
print(t)
T = t()
print(T.a)
T.hello()
print(T.name)

&lt;class '__main__.hello'&gt;
1
hello world
10
</code></pre>
<p>所以type是可以实现<b>动态创建类</b>的,其实<font color="red">python中一切都是对象,类也是对象;只不过是一种特殊的对象,是type的对象</font></p>
<p>python中类创建的本质:<br>
我们使用class创建类,当你使用class关键字时,Python解释器自动创建这个对象。而底层其实使用的是type函数(type函数也可以查看实例所属类型)来创建类的。所以我们可以直接使用type()函数来手动实现动态创建类。</p>
<p>当type()只有一个参数时,其作用就是返回变量或对象的类型<br>
当type()有三个参数时,其作用就是创建类对象:<br>
  第一个参数:name表示类名称,字符串类型<br>
  第二个参数:bases表示继承对象(父类),元组类型,单元素使用逗号<br>
  第三个参数:attr表示属性,这里可以填写类属性、类方式、静态方法,采用字典格式,key为属性名,value为属性值</p>
<p>总结:</p>
<blockquote>
<p>通过type添加的属性是类属性,并不是实例属性</p>
<p>通过type可以给类添加普通方法,静态方法,类方法,效果跟class一样</p>
<p>type创建类的效果,包括继承等的使用性质和class创建的类一样。本质class创建类的本质就是用type创建。所以可以说python中所有类都是type创建的。</p>
</blockquote>
<p>对元类的理解与注意事项</p>
<blockquote>
<p>元类就是类的类,python中函数type实际上是一个元类。type就是Python在背后用来创建所有类的元类。Python中所有的东西——都是对象。这包括整数、字符串、函数以及类。它们全部都是对象,而且它们都是从一个类创建而来,这个类就是type。type就是Python的内建元类,当然了,也可以创建自己的元类</p>
</blockquote>
<p>。</p>
<p>python查看对象所属类型既可以用type函数,也可以用对象自带的__class__属性。<br>
以下代码验证:任何对象最终的所属类都是type。 type是所有类的创造者。</p>
<pre><code>num = 1
print(num.__class__)
print(num.__class__.__class__)

&lt;class 'int'&gt;
&lt;class 'type'&gt;
</code></pre>

         

</div>
<div id="MySignature" role="contentinfo">
    所思及所学
学而不思则罔,思而不学则殆!<br><br>
来源:https://www.cnblogs.com/ilovepython/p/11068850.html
頁: [1]
查看完整版本: Python中type()详解:动态创建类