先来一段代码
<code>#!/usr/bin/env python</code>
<code># _*_ coding:utf-8 _*_</code>
<code>class</code> <code>A:</code>
<code> </code><code>def</code> <code>bar(</code><code>self</code><code>):</code>
<code> </code><code>print</code><code>(</code><code>"BAR"</code><code>)</code>
<code> </code><code>self</code><code>.f1()</code>
<code> </code>
<code>class</code> <code>B(A):</code>
<code> </code><code>def</code> <code>f1(</code><code>self</code><code>):</code>
<code> </code><code>print</code><code>(</code><code>"B"</code><code>)</code>
<code>class</code> <code>C:</code>
<code> </code><code>print</code><code>(</code><code>"C"</code><code>)</code>
<code>class</code> <code>D(C, B):</code>
<code> </code><code>pass</code>
<code> </code>
<code>obj </code><code>=</code> <code>D()</code>
<code>obj.bar()</code>
执行结果
<code>/</code><code>usr</code><code>/</code><code>bin</code><code>/</code><code>python3.</code><code>5</code> <code>/</code><code>home</code><code>/</code><code>ansheng</code><code>/</code><code>文档</code><code>/</code><code>Python_code</code><code>/</code><code>sublime</code><code>/</code><code>Week06</code><code>/</code><code>Day03</code><code>/</code><code>s1.py</code>
<code>BAR</code>
<code>C</code>
<code>Process finished with exit code </code><code>0</code>
流程释意:
创建了类A、B、C、D;
<code>D</code>继承了<code>C</code>和<code>B</code>,<code>B</code>继承了<code>A</code>,<code>D</code>内什么都不做,<code>pass</code>;
创建一个对象<code>obj</code>,类是<code>D</code>,当执行<code>D</code>的<code>bar</code>方法的时候会先从<code>C</code>里面寻找有没有<code>bar</code>方法;
<code>C</code>内没有<code>bar</code>方法,然后继续从<code>B</code>里面查找,<code>B</code>里面也没有,<code>B</code>的父类是<code>A</code>,<code>A</code>里面有<code>bar</code>方法,所以就执行了<code>A</code>的<code>bar</code>方法;
<code>A</code>的<code>bar</code>方法首先输出了<code>BAR</code>;
然后又执行了<code>self.f1()</code>,<code>self</code>=<code>obj</code>,相当于执行了<code>obj.f1()</code>;
执行<code>obj.f1()</code>的时候先从<code>C</code>里面查找有没有<code>f1</code>这个方法,<code>C</code>里面又<code>f1</code>这个方法;
最后就执行<code>C</code>里面的<code>f1</code>方法了,输出了<code>C</code>
<code>class</code> <code>Annimal:</code>
<code> </code><code>def</code> <code>__init__(</code><code>self</code><code>):</code>
<code> </code><code>print</code><code>(</code><code>"Annimal的构造方法"</code><code>)</code>
<code> </code><code>self</code><code>.ty </code><code>=</code> <code>"动物"</code>
<code>class</code> <code>Cat(Annimal):</code>
<code> </code><code>print</code><code>(</code><code>"Cat的构造方法"</code><code>)</code>
<code> </code><code>self</code><code>.n </code><code>=</code> <code>"猫"</code>
<code> </code><code># 寻找Cat类的父类,然后执行父类的构造方法</code>
<code> </code><code>super</code><code>(Cat, </code><code>self</code><code>).__init__()</code>
<code>mao </code><code>=</code> <code>Cat()</code>
<code>print</code><code>(mao.__dict__)</code>
<code>Cat的构造方法</code>
<code>Annimal的构造方法</code>
<code>{</code><code>'ty'</code><code>: </code><code>'动物'</code><code>, </code><code>'n'</code><code>: </code><code>'猫'</code><code>}</code>
先执行了Cat的构造方法,然后又执行了Annimal的构造方法。
第二种执行父类的方法如下:
<code>Annimal.__init__(</code><code>self</code><code>)</code>
不推荐使用
<code>class</code> <code>Foo:</code>
<code> </code><code>def</code> <code>__init__(</code><code>self</code><code>, name):</code>
<code> </code><code>self</code><code>.name </code><code>=</code> <code>name</code>
<code> </code><code>def</code> <code>show(</code><code>self</code><code>):</code>
<code> </code><code>print</code><code>(</code><code>'show'</code><code>)</code>
<code>obj </code><code>=</code> <code>Foo(</code><code>"as"</code><code>)</code>
<code># 如果是类,就只能找到类里的成员</code>
<code>print</code><code>(</code><code>hasattr</code><code>(Foo, </code><code>"show"</code><code>))</code>
<code># 如果是对象,既可以找到对象,也可以找类里的成员</code>
<code>print</code><code>(</code><code>hasattr</code><code>(obj, </code><code>"name"</code><code>))</code>
<code>print</code><code>(</code><code>hasattr</code><code>(obj, </code><code>"show"</code><code>))</code>
<code>/</code><code>usr</code><code>/</code><code>bin</code><code>/</code><code>python3.</code><code>5</code> <code>/</code><code>home</code><code>/</code><code>ansheng</code><code>/</code><code>文档</code><code>/</code><code>Python_code</code><code>/</code><code>sublime</code><code>/</code><code>Week06</code><code>/</code><code>Day03</code><code>/</code><code>s2.py</code>
<code>True</code>
<code>s1</code>脚本文件内容:
<code># _*_coding:utf-8 _*_</code>
<code># 导入模块</code>
<code>m </code><code>=</code> <code>__import__</code><code>(</code><code>'s2'</code><code>, fromlist</code><code>=</code><code>True</code><code>)</code>
<code># 去模块中找类</code>
<code>class_name </code><code>=</code> <code>getattr</code><code>(m, </code><code>"Foo"</code><code>)</code>
<code># 根据类创建对象</code>
<code>obj </code><code>=</code> <code>class_name(</code><code>"ansheng"</code><code>)</code>
<code># 去对象中找name对应的值</code>
<code>print</code><code>(</code><code>getattr</code><code>(obj, </code><code>'name'</code><code>))</code>
<code>s2</code>脚本文件内容
<code> </code><code># 普通字段,保存在对象中</code>
执行结果:
<code>/</code><code>usr</code><code>/</code><code>bin</code><code>/</code><code>python3.</code><code>5</code> <code>/</code><code>home</code><code>/</code><code>ansheng</code><code>/</code><code>文档</code><code>/</code><code>Python_code</code><code>/</code><code>sublime</code><code>/</code><code>Week06</code><code>/</code><code>Day04</code><code>/</code><code>s1.py</code>
<code>ansheng</code>
静态字段存在类中,如下:
<code># 静态字段存在的意义就是将每个对象中重复的东西在类里面保存一份即可,这就是静态字段</code>
<code>class</code> <code>Provice:</code>
<code> </code><code># 静态字段</code>
<code> </code><code>contry </code><code>=</code> <code>"China"</code>
<code> </code><code>print</code><code>(Provice.contry, </code><code>self</code><code>.name)</code>
<code>hebei </code><code>=</code> <code>Provice(</code><code>"河北"</code><code>)</code>
<code>hebei.show()</code>
<code>hubei </code><code>=</code> <code>Provice(</code><code>"湖北"</code><code>)</code>
<code>hubei.show()</code>
<code>/</code><code>usr</code><code>/</code><code>bin</code><code>/</code><code>python3.</code><code>5</code> <code>/</code><code>home</code><code>/</code><code>ansheng</code><code>/</code><code>文档</code><code>/</code><code>Python_code</code><code>/</code><code>sublime</code><code>/</code><code>Week06</code><code>/</code><code>Day04</code><code>/</code><code>s2.py</code>
<code>China 河北</code>
<code>China 湖北</code>
类里面的成员类去访问,对象内的成员用对象去访问。
<code> </code><code># 静态方法括号内没有self,切方法前一行要加上@staticmethod</code>
<code> </code><code>@</code><code>staticmethod</code>
<code> </code><code>def</code> <code>static():</code>
<code> </code><code># def static(arg1, arg2): # 也可以设置参数</code>
<code> </code><code>print</code><code>(</code><code>"static"</code><code>)</code>
<code># 静态方法通过类名+方法名既可执行</code>
<code>Foo.static()</code>
<code># Foo.static("arg1", "arg2") 通过类调用的时候传入对于的参数即可</code>
<code># 静态方法也可以通过对象去访问,对于静态方法用类去访问</code>
<code>obj </code><code>=</code> <code>Foo()</code>
<code>obj.static(</code>
<code> </code><code># 创建类方法的时候需要在方法前面加上@classmethod</code>
<code> </code><code>@</code><code>classmethod</code>
<code> </code><code>def</code> <code>ClassMethod</code><code>(</code><code>cls</code><code>): </code><code># 并且方法的括号内必须带有cls关键字,类方法的参数是当前类的类名</code>
<code> </code><code>print</code><code>(</code><code>"类方法"</code><code>)</code>
<code># 调用类方法</code>
<code>Foo.</code><code>ClassMethod</code><code>()</code>
<code>类方法</code>
字段
1.静态字段(每个对象都有一份)
2.普通字段(每个对象都不同的数据)
方法
1.静态方法(无需使用对象封装的内容)
2.类方法
3.普通方法(适用对象中的数据)
特性
1.普通特性(将方法未造成字段)
快速判断,类执行、对象执行:
1.self —> 对象调用
2.无self —> 类调用
本文转自 Edenwy 51CTO博客,原文链接:http://blog.51cto.com/edeny/1917743,如需转载请自行联系原作者