你好,请看下面的例子和说明:python中类的初始化方法是__init__(),因此父类子类的初始化方法都是这个,如果子类不实现这个函数,初始化时调用父类的初始化函数,如果子类实现这个函数,就覆盖了父类的这个函数,既然继承父类,就要在这个函数里显式调用一下父类的__init__(),这跟C++,jAVA不一样,他们是自动调用父类初始化函数的。调用父类函数有以下方法:class A:def method(self, arg):pass class B(A):def method(self, arg):# A.method(self,arg) # 1# super(B, self).method(arg) #2super().method(arg) #31.直接写类名调用2.用super(type,obj).method(arg)方法调用。3.在类定义中调用本类的父类方法,可以直接super().method(arg).在代码中调用对象的父类的方法的示例:ob = B()super(B,ob).method(arg) #调用class B的父类class A的method。初始化中调用父类初始化方法示例:class B(A):
成都创新互联公司专注于资源网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供资源营销型网站建设,资源网站制作、资源网页设计、资源网站官网定制、成都微信小程序服务,打造资源网络公司原创品牌,更为您提供资源网站排名全网营销落地服务。
如果你有两个同名的模块,那么你只能导人它们中的一个——默认情况下,Python总是会选择在模块搜索路径sys.path中最左边的那一项。如果你偏爱的模块和顶层脚本在同一目录下,那就不成问题;由于顶层脚本的主目录总是模块搜索路径中的第一项,因此它的内容总是会首先被自动定位。然而对于跨目录的导入,模块搜索路径的线性本质意味着同名的文件会产生冲突。
要修复这一冲突,要么避免同名文件。如果你需要同时访问两个同名的文件,那么就要把两个源文件分别放入子目录中,这样包导入目录名称将使得模块引用唯一。只要外围的包目录名称是唯一的,你就能访问同名模块中的任意一个,或是全部的两个。注意,如果你不小心为自己的模块使用了一个名称,而它碰巧和你需要使用的标准库模块的名称相同,那么也会出现这一问题。这是因为程序主目录(或是模块路径中靠前的另一个目录)下的本地模块会隐藏和替换标准库模块。要修复这种覆盖,要么避免使用和你需要的另一模块相同的名称,要么把模块放到一个包目录下然后使用Python 3.X的包相对导入模型(包相对导入在2.X版本中是一个可选的功能)。在包相对导入模型下,普通导入会跳过包目录,因此你可以获取标准库版本,但在必要时特殊的点号开头导入语句仍然可以选取同名模块的本地版本。
不要被迷惑,
你在子类__init__函数内部重新覆盖了value变量的值而已;
class
P(object):
def
__init__(self):
self.value
=
def
get(self):
self.value
return
id(self.value)
class
C(P):
def
__init__(self):
super(C,
self).__init__()
#标准的写法是这样的,
先调用父类构造函数
self.value
=
44
#两句交换一下位置看看
C().get()
1:在DerivedClass2
中,执行init
用了2个函数
BaseClass1.__init__(self)
BaseClass2.__init__(self)
所以
self.name
最后是
'BaseClass2_Name'
2:
调用class3.getname()
根据python多重继承规则,从左到右,深度优先,调用的是BaseClass1的getname方法。
因此输出这个结果。
sys.path是一个list,存放了当前所有import搜索的路径。
绝大多数情况下,首个元素是"",即空串,也就是说,当你import re的时候,首先搜索的是"re",这时候就会直接在当前目录搜索到re。如下图:
解决方法也有不止一个:
1,在当前目录创建一个子文件夹,例如mine,在mine里放一个__init__.py,不用有代码,空文件即可。使用的时候:import mine.re
2,在sys.path上做手脚,把第一个空串挪到最后面去:
import sys
sys.path = sys.path[1:]
sys.path.append("")
这样当前目录会跑到最后面去,从而达到最后搜索的目的。
不过这很可能有副作用,即你创建的模块,不能和前面搜索路径里的任何文件重名,否则会无法import你的模块。
这也是为什么默认把当前路径放在最前搜索的原因,因为是用户自己写的,显然优先级最高。
尽管就你的问题作出分析和提出一些可能的解决办法,但是严重不建议在实际工程起和系统模块重名的文件名,这是自找麻烦。
当然,研究探讨它的实现原理,始终是值得肯定的。
最后强调一下,当你在当前文件夹创建了一个sys.py时,方法2不好用!