又来求助了,大神求解答 python类继承的问题 又来求助了,大神求解答 python类继承的问题

\u53c8\u6765\u6c42\u52a9\u4e86\uff0c\u5927\u795e\u6c42\u89e3\u7b54 python\u7c7b\u7ee7\u627f\u7684\u95ee\u9898

1.\u9996\u5148\u6253\u5f00\u6570\u636e\u5e93\u8f6f\u4ef6\uff0c\u65b0\u5efa\u67e5\u8be2\u6587\u6863\uff0c... 1 2.\u5f00\u59cb\u5b9a\u4e49\u53d8\u91cf\uff0c\u5e76\u8d4b\u521d\u59cb\u503c\uff0c\u5982\u56fe\uff1a ... 2 3.\u5efa\u7acb\u4ece\u56fe\u5f62\u9012\u589e\u5f00\u59cb\uff0c\u9996\u5148\u5efa\u7acb\u5faa\u73af\uff0c... 3 5.\u4ece\u65b0\u7ed9\u53d8\u91cf\u8d4b\u503c\uff0c\u4e3a\u8fdb\u884c\u5012\u4e09\u89d2\u7684\u51c6\u5907... 4 6.\u5efa\u7acb\u4ece\u56fe\u5f62\u9012\u51cf\u5f00\u59cb\uff0c\u9996\u5148\u5efa\u7acb\u5faa\u73af

\u4e00\u3001\u7c7b\u5b9a\u4e49\uff1a

class :


\u7c7b\u5b9e\u4f8b\u5316\u540e\uff0c\u53ef\u4ee5\u4f7f\u7528\u5176\u5c5e\u6027\uff0c\u5b9e\u9645\u4e0a\uff0c\u521b\u5efa\u4e00\u4e2a\u7c7b\u4e4b\u540e\uff0c\u53ef\u4ee5\u901a\u8fc7\u7c7b\u540d\u8bbf\u95ee\u5176\u5c5e\u6027
\u5982\u679c\u76f4\u63a5\u4f7f\u7528\u7c7b\u540d\u4fee\u6539\u5176\u5c5e\u6027\uff0c\u90a3\u4e48\u5c06\u76f4\u63a5\u5f71\u54cd\u5230\u5df2\u7ecf\u5b9e\u4f8b\u5316\u7684\u5bf9\u8c61

\u7c7b\u7684\u79c1\u6709\u5c5e\u6027\uff1a
__private_attrs \u4e24\u4e2a\u4e0b\u5212\u7ebf\u5f00\u5934\uff0c\u58f0\u660e\u8be5\u5c5e\u6027\u4e3a\u79c1\u6709\uff0c\u4e0d\u80fd\u5728\u7c7b\u5730\u5916\u90e8\u88ab\u4f7f\u7528\u6216\u76f4\u63a5\u8bbf\u95ee
\u5728\u7c7b\u5185\u90e8\u7684\u65b9\u6cd5\u4e2d\u4f7f\u7528\u65f6 self.__private_attrs

\u7c7b\u7684\u65b9\u6cd5
\u5728\u7c7b\u5730\u5185\u90e8\uff0c\u4f7f\u7528def\u5173\u952e\u5b57\u53ef\u4ee5\u4e3a\u7c7b\u5b9a\u4e49\u4e00\u4e2a\u65b9\u6cd5\uff0c\u4e0e\u4e00\u822c\u51fd\u6570\u5b9a\u4e49\u4e0d\u540c\uff0c\u7c7b\u65b9\u6cd5\u5fc5\u987b\u5305\u542b\u53c2\u6570self,\u4e14\u4e3a\u7b2c\u4e00\u4e2a\u53c2\u6570


\u79c1\u6709\u7684\u7c7b\u65b9\u6cd5
__private_method \u4e24\u4e2a\u4e0b\u5212\u7ebf\u5f00\u5934\uff0c\u58f0\u660e\u8be5\u65b9\u6cd5\u4e3a\u79c1\u6709\u65b9\u6cd5\uff0c\u4e0d\u80fd\u5728\u7c7b\u5730\u5916\u90e8\u8c03\u7528
\u5728\u7c7b\u7684\u5185\u90e8\u8c03\u7528slef.__private_methods
\u7c7b\u7684\u4e13\u6709\u65b9\u6cd5\uff1a
__init__ \u6784\u9020\u51fd\u6570\uff0c\u5728\u751f\u6210\u5bf9\u8c61\u65f6\u8c03\u7528
__del__ \u6790\u6784\u51fd\u6570\uff0c\u91ca\u653e\u5bf9\u8c61\u65f6\u4f7f\u7528
__repr__ \u6253\u5370\uff0c\u8f6c\u6362
__setitem__\u6309\u7167\u7d22\u5f15\u8d4b\u503c
__getitem__\u6309\u7167\u7d22\u5f15\u83b7\u53d6\u503c
__len__\u83b7\u5f97\u957f\u5ea6
__cmp__\u6bd4\u8f83\u8fd0\u7b97
__call__\u51fd\u6570\u8c03\u7528

__add__\u52a0\u8fd0\u7b97
__sub__\u51cf\u8fd0\u7b97
__mul__\u4e58\u8fd0\u7b97
__div__\u9664\u8fd0\u7b97
__mod__\u6c42\u4f59\u8fd0\u7b97
__pow__\u79f0\u65b9
\u793a\u4f8b:

#\u7c7b\u5b9a\u4e49
class people:
#\u5b9a\u4e49\u57fa\u672c\u5c5e\u6027
name = ''
age = 0
#\u5b9a\u4e49\u79c1\u6709\u5c5e\u6027,\u79c1\u6709\u5c5e\u6027\u5728\u7c7b\u5916\u90e8\u65e0\u6cd5\u76f4\u63a5\u8fdb\u884c\u8bbf\u95ee
__weight = 0
#\u5b9a\u4e49\u6784\u9020\u65b9\u6cd5
def __init__(self,n,a,w):
self.name = n
self.age = a
self.__weight = w
def speak(self):
print("%s is speaking: I am %d years old" %(self.name,self.age))


p = people('tom',10,30)
p.speak()


\u4e8c\u3001\u7ee7\u627f\u7c7b\u5b9a\u4e49\uff1a
1.\u5355\u7ee7\u627f

class (\u7236\u7c7b\u540d)

eg.
class childbook(book)
age = 10


2.\u7c7b\u7684\u591a\u91cd\u7ee7\u627f

class \u7c7b\u540d(\u7236\u7c7b1,\u7236\u7c7b2,....,\u7236\u7c7bn)




\u9700\u8981\u6ce8\u610f\u5706\u62ec\u53f7\u4e2d\u7236\u7c7b\u7684\u987a\u5e8f\uff0c\u82e5\u662f\u7236\u7c7b\u4e2d\u6709\u76f8\u540c\u7684\u65b9\u6cd5\u540d\uff0c\u800c\u5728\u5b50\u7c7b\u4f7f\u7528\u65f6\u672a\u6307\u5b9a\uff0cpython\u4ece\u5de6\u81f3\u53f3\u641c\u7d22,\u5373\u65b9\u6cd5\u5728\u5b50\u7c7b\u4e2d\u672a\u627e\u5230\u65f6\uff0c\u4ece\u5de6\u5230\u53f3\u67e5\u627e\u7236\u7c7b\u4e2d\u662f\u5426\u5305\u542b\u65b9\u6cd5
#\u53e6\u4e00\u4e2a\u7c7b\uff0c\u591a\u91cd\u7ee7\u627f\u4e4b\u524d\u7684\u51c6\u5907
class speaker():
topic = ''
name = ''
def __init__(self,n,t):
self.name = n
self.topic = t
def speak(self):
print("I am %s,I am a speaker!My topic is %s"%(self.name,self.topic))

#\u591a\u91cd\u7ee7\u627f
class sample(speaker,student):
a =''
def __init__(self,n,a,w,g,t):
student.__init__(self,n,a,w,g)
speaker.__init__(self,n,t)

test = sample("Tim",25,80,4,"Python")
test.speak()#\u65b9\u6cd5\u540d\u540c\uff0c\u9ed8\u8ba4\u8c03\u7528\u7684\u662f\u5728\u62ec\u53f7\u4e2d\u6392\u524d\u5730\u7236\u7c7b\u7684\u65b9\u6cd5


\u7c7b\u65b9\u6cd5\u7684\u8986\u5199\u2014\u2014\u5b50\u7c7b\u8986\u76d6\u6389\u7236\u7c7b\u7684\u65b9\u6cd5
def \u65b9\u6cd5\u540d\u4e0e\u7236\u7c7b\u4e00\u81f4
\u82e5\u662f\u5728\u65b9\u6cd5\u4e2d\u8981\u4f7f\u7528\u5230\u7236\u7c7b\u65b9\u6cd5 \u7236\u7c7b\u540d.\u65b9\u6cd5\u540d

\u82e5\u662f\u5c06\u7c7b\u653e\u5230\u4e86\u6a21\u5757\u4e2d

\u4f7f\u7528\u65f6

import A
l = A.\u7c7b()

老式类就是经典类,不是继承自object类.在多继承时采用深度优先遍历父类.
新式类就是基类继承自object类  class xxx(object).多继承时采用一种新的C3 算法来遍历父类.
实例如下:

class GrandFather(object):
def speak(self):
print "speak: I am grandfather"


class Father(GrandFather):
def eat(self):
pass


class Mother(GrandFather):
def speak(self):
print "speak: I am mother"


class Son(Father, Mother):
def eat(self):
pass
#GrandFather继承object就为"新式类",去掉就为"旧式类"
son  = Son()
son.speak()

新式类的打印结果如下:

1

speak: I am mother

旧式类的打印结果如下:

1

speak: I am GrandFather

由此我们可以看出新式类的搜索过程为:Son-->Father-->Mother,而旧式类的搜索过程为:Son-->Father-->GrandFather

我们可以看出旧式类和我们预期的继承不太一样。

老式类就是经典类,不是继承自object类.在多继承时采用深度优先遍历父类.
新式类就是基类继承自object类  class xxx(object).多继承时采用一种新的C3 算法来遍历父类.

为什么采用C3算法呢?

C3算法最早被提出是用于Lisp的,应用在Python中是为了解决原来基于深度优先搜索算法不满足本地优先级,和单调性的问题。

本地优先级:指声明时父类的顺序,比如C(A,B),如果访问C类对象属性时,应该根据声明顺序,优先查找A类,然后再查找B类。

单调性:如果在C的解析顺序中,A排在B的前面,那么在C的所有子类里,也必须满足这个顺序。

为了解释C3算法,我们引入了mro(mro即 method resolution order (方法解释顺序),主要用于在多继承时判断属性的路径(来自于哪个类))。

我们可以通过class.mro()来查看python类的mro

C3算法
判断mro要先确定一个线性序列,然后查找路径由由序列中类的顺序决定。所以C3算法就是生成一个线性序列。
如果继承至一个基类:
class B(A)
这时B的mro序列为[B,A]

如果继承至多个基类
class B(A1,A2,A3 ...)
这时B的mro序列 mro(B) = [B] + merge(mro(A1), mro(A2), mro(A3) ..., [A1,A2,A3])


merge操作就是C3算法的核心。
遍历执行merge操作的序列,如果一个序列的第一个元素,是其他序列中的第一个元素,或不在其他序列出现,则从所有执行merge操作序列中删除这个元素,合并到当前的mro中。
merge操作后的序列,继续执行merge操作,直到merge操作的序列为空。
如果merge操作的序列无法为空,则说明不合法。

例子:
class A(O):pass
class B(O):pass
class C(O):pass
class E(A,B):pass
class F(B,C):pass
class G(E,F):pass

A、B、C都继承至一个基类,所以mro序列依次为[A,O]、[B,O]、[C,O]
mro(E) = [E] + merge(mro(A), mro(B), [A,B])
= [E] + merge([A,O], [B,O], [A,B])
执行merge操作的序列为[A,O]、[B,O]、[A,B]
A是序列[A,O]中的第一个元素,在序列[B,O]中不出现,在序列[A,B]中也是第一个元素,所以从执行merge操作的序列([A,O]、[B,O]、[A,B])中删除A,合并到当前mro,[E]中。
mro(E) = [E,A] + merge([O], [B,O], [B])
再执行merge操作,O是序列[O]中的第一个元素,但O在序列[B,O]中出现并且不是其中第一个元素。继续查看[B,O]的第一个元素B,B满足条件,所以从执行merge操作的序列中删除B,合并到[E, A]中。
mro(E) = [E,A,B] + merge([O], [O])
= [E,A,B,O]



扩展阅读:聊天对话回复神器 ... 你已被管理员移出群聊 ... 扫一扫题目出答案 ... 别说了分手吧 东神sama ... 一键恢复已删群聊 ... 求大神歌名系列视频 ... 跪求此女名字 如图 ... 取消年检 呼声越来越大 ... 黄大蒜求助大神这是什么歌 ...

本站交流只代表网友个人观点,与本站立场无关
欢迎反馈与建议,请联系电邮
2024© 车视网