本文的目的是介绍super的详细情况,特别关注和Parent类名称之间有什么区别?的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解super的机会,同时也不会遗漏关于
本文的目的是介绍super的详细情况,特别关注和Parent类名称之间有什么区别?的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解super的机会,同时也不会遗漏关于bool()和operator.truth()之间有什么区别?、clock(),gettickcount(),QueryPerformanceCounter()和QueryPerformanceFrequency()之间有什么区别?、css – parent *:hover {}和parent:hover * {}之间有什么区别?、css – rgba(0,0,0,0)和transparent之间有什么区别?的知识。
本文目录一览:- super()和Parent类名称之间有什么区别?(super.和super()区别)
- bool()和operator.truth()之间有什么区别?
- clock(),gettickcount(),QueryPerformanceCounter()和QueryPerformanceFrequency()之间有什么区别?
- css – parent *:hover {}和parent:hover * {}之间有什么区别?
- css – rgba(0,0,0,0)和transparent之间有什么区别?
super()和Parent类名称之间有什么区别?(super.和super()区别)
super()
直接使用和直接使用父类名称之间有区别吗?例如:
class Parent: def __init__(self): print("In parent") self.__a=10class Child(Parent): def __init__(self): super().__init__() # using super() Parent.__init__(self) # using Parent class namec=Child()
是否有内部之间的差异super().__init__()
和Parent.__init__(self)
?
答案1
小编典典在 这种情况下 不是。但是 通常 ,尤其是当您使用 多重继承时
,按照文档中指定 super()
的 方法 委托给 方法解析顺序(MRO)中 的下一个对象
:
super([type[, object-or-type]])
返回将方法调用委托给类型的父级或同级类的 代理对象
。这对于访问已在类中重写的继承方法很有用。搜索顺序与所使用的顺序相同,getattr()
只是类型本身被跳过。
__mro__
类型的 属性列出了getattr()
和所使用
的方法分辨率搜索顺序super()
。该属性是动态的,并且在继承层次结构更新时可以更改。(…)
(已复制,添加了黑体字)
举例来说,您定义了类似的类(从这个问题中借来的,在此更详细地讨论了MRO):
class F: def __init__(self): print(''F%s''%super().__init__) super().__init__()class G: def __init__(self): print(''G%s''%super().__init__) super().__init__()class H: def __init__(self): print(''H%s''%super().__init__) super().__init__()class E(G,H): def __init__(self): print(''E%s''%super().__init__) super().__init__()class D(E,F): def __init__(self): print(''D%s''%super().__init__) super().__init__()class C(E,G): def __init__(self): print(''C%s''%super().__init__) super().__init__()class B(C,H): def __init__(self): print(''B%s''%super().__init__) super().__init__()class A(D,B,E): def __init__(self): print(''A%s''%super().__init__) super().__init__()
那么__mro__
ofA
是:
A.__mro__ == (A,D,B,C,E,G,H,F,object)
现在,如果调用A()
,它将输出:
A<bound method D.__init__ of <__main__.A object at 0x7efefd8645c0>>D<bound method B.__init__ of <__main__.A object at 0x7efefd8645c0>>B<bound method C.__init__ of <__main__.A object at 0x7efefd8645c0>>C<bound method E.__init__ of <__main__.A object at 0x7efefd8645c0>>E<bound method G.__init__ of <__main__.A object at 0x7efefd8645c0>>G<bound method H.__init__ of <__main__.A object at 0x7efefd8645c0>>H<bound method F.__init__ of <__main__.A object at 0x7efefd8645c0>>F<method-wrapper ''__init__'' of A object at 0x7efefd8645c0><__main__.A object at 0x7efefd8645c0>
因此,这意味着 在A
和尝试 获得__init__
该上下文 时:
super().__init__
的A
是D.__init__
;super().__init__
的D
是B.__init__
;super().__init__
的B
是C.__init__
;super().__init__
的C
是E.__init__
;super().__init__
的E
是G.__init__
;super().__init__
的G
是H.__init__
;super().__init__
的H
是F.__init__
; 和super().__init__
的F
是object.__init__
。
因此请注意,super()
它 本身 并不 委托给父母
。例如,super()
ofD
是B
andB
不是of的超类D
,因此它实际上 取决于对象的类型 (而不取决于类)。
现在,如果为D
,__mro__
则为:
D.__mro__ = (D,E,G,H,F,object)
如果构造一个a,D
我们得到:
D<bound method E.__init__ of <__main__.D object at 0x7efefd864630>>E<bound method G.__init__ of <__main__.D object at 0x7efefd864630>>G<bound method H.__init__ of <__main__.D object at 0x7efefd864630>>H<bound method F.__init__ of <__main__.D object at 0x7efefd864630>>F<method-wrapper ''__init__'' of D object at 0x7efefd864630>
因此 ,在D
它 的上下文中 认为:
super().__init__
的D
是E.__init__
;super().__init__
的E
是G.__init__
;super().__init__
的G
是H.__init__
;super().__init__
的H
是F.__init__
; 和super().__init__
的F
是object.__init__
。
因此,这里 的super()
的D
导致E
(对于__init__
)这是 不是在上下文中的相同A
。
bool()和operator.truth()之间有什么区别?
bool()
和operator.truth()
两个测试值是否
truthy 或 falsy ,他们似乎从文档颇为相似,它甚至说,在truth()
文档是:
这等效于使用bool构造函数。
但是,truth()
速度bool()
是简单测试的两倍(显示了Python 3.6的计时,但2.7相似):
from timeit import timeitprint(timeit(''bool(1)'', number=10000000))# 2.180289956042543print(timeit(''truth(1)'', setup=''from operator import truth'', number=10000000))# 0.7202018899843097
那有什么区别呢?我应该使用truth()
代替bool()
吗?
答案1
小编典典虽然bool()
并operator.truth()
输出 为主要用途的情况下相同的结果他们的 实现
实际上是相当不同的。bool()
是一个类或类型的构造函数,同时truth()
是一个狭窄的优化正则函数。
实际上,还有两个区别:1)bool()
在不带参数的情况下调用return
sFalse
whiletruth()
需要一个参数。2)bool()
接受x
关键字参数,例如bool(x=1)
,而truth()
没有关键字参数。bool()
对于常规用例,这两者都会增加开销。
关键字的实现很奇怪,因为可能没有人需要它,而且名称x
几乎没有描述性。Issue29695涵盖了这一点,实际上,该问题不仅影响到bool()
其他类,例如int()
或list()
。但是,从Python
3.7开始,这些关键字参数将被删除,并且速度应会提高。尽管如此,我还是在最新的Python
3.8分支上测试了时序,并且bool()
比以前更快,但仍比以前快两倍truth()
,这可能是由于的实现更为通用bool()
。
因此,如果您的任务非常重视速度,那么我建议您在需要函数的情况下使用truth()
overbool()
(例如,解析为的键sorted()
)。但是,正如khelwood所指出的那样,bool()
有时还是会更快filter(bool,iterable)
,所以最好将您的用例确定为最佳选择。
当然,如果您不需要功能,而只想测试值是 真 还是 假 ,则应使用惯用语if
或ifnot
语句,如khelwood和ser2357112所评论的那样,这是最快的。
clock(),gettickcount(),QueryPerformanceCounter()和QueryPerformanceFrequency()之间有什么区别?
他们都提供毫秒分辨率吗?
Linux clock_gettime(CLOCK_MONOTONIC)奇怪的非单调行为
C:Windows和其他操作系统中clock()的不同实现?
了解clock_gettime的问题
如何查看用户是否设置时钟?
在linux的进程间通信应该使用哪个时钟?
不,他们没有毫秒精度。 clock和GetTickCount在大多数系统上具有4到15毫秒的精度。 QueryPerformanceCounter的精度在微秒到纳秒范围内。
clock是GetTickCount一个包装,如果你使用微软的C运行时库,如果你使用的是MS编译器,你可能是。 GetTickCount返回一个以毫秒为单位的值,但在一毫秒后它不会增加1毫秒。 只有当系统时钟中断发生时才会增加,这个时间间隔是每4到15毫秒 – 通常是15ms,但是它可以被应用程序改变。 这会影响整个计算机:它影响线程调度,并且更频繁的中断的开销也会使实际运行的程序代码的cpu时间更少,所以除非真的需要,否则不要这样做。 如果你的计算机的打勾时间比15ms多一些,其他一些应用程序已经修改了打勾中断频率。
QueryPerformanceCounter使用系统上可用的任何高分辨率计时器。 在过去,通常是基于处理器内部的时钟周期计数,所以计算在2-3GHz或约0.5ns。 不幸的是,一些处理器会改变计数器在处于低功耗状态时的速率,而在多cpu系统(即多处理器插槽)中,如果cpu速度并不一样,则会出现问题。 Windows现在使用其他更可靠的来源,但它们的分辨率不如处理器那么高。 QueryPerformanceFrequency告诉您一秒钟内有多少个刻度。 要获得毫秒,将QPC样本的差值乘以1000,除以QueryPerformanceFrequency的结果。
clock
一个C ++函数 它会返回自应用程序启动以来cpu的滴答数。 要将其转换为秒,请用CLOCKS_PER_SEC分隔。
GetTickCount
一个Win32 API函数。 返回系统启动以来的毫秒数。
QueryPerformanceCounter
一个Win32 API函数。 性能计数器是随着时间的推移而增加的高分辨率计数器 。 要将其转换为以秒为单位按QueryPerformanceFrequency划分。
css – parent *:hover {}和parent:hover * {}之间有什么区别?
如果我改变这个:
.parent *:hover {}
对此:
.parent:hover * {}
在随后的代码中:
#child { width: 100%; height: 100%; } .parent { background-color: green; width: 100px; height: 100px; } .parent:hover * { background-color: red; }
<html> <head> <title>HTML Sample</title> </head> <body> <div> <div id="child"></div> </div> </body> </html>
没有任何变化,悬停效果保持不变.我在这里错过了什么?
解决方法
> .parent:hover * {}表示使用class =“parent”定位任何元素的所有后代,而class =“parent”的元素处于悬停状态(请注意,如果后代元素悬停,那么.parent,即使它们不形成单个有凝聚力的视觉单元(例如,位置:绝对正在使用).
如果您的< div class =“parent”>有多个孩子然后第一个规则(.parent *:hover {})只会影响单个后代,而特定的后代是悬停的 – 所以如果用户鼠标悬停另一个元素,那么样式规则将会改变.
第二个规则就是如果.parent是鼠标悬停的话,那么所有后代都会改变它们的样式.这不是一个好的样式规则,因为后代选择器将选择.parent下的所有内容(例如,每个< span>,< a>,< p>等).您可能应该使用更具体的选择器.
css – rgba(0,0,0,0)和transparent之间有什么区别?
transparent
Fully transparent. This keyword can be considered a
shorthand for transparent black,rgba(0,0),which is its computed
value.
那么什么给了?为什么两个看似相同的值会产生不同的结果?我已经看过RGBA的the formatting,并寻找类似的问题(无济于事)。每个问题/答案提到从透明到rgba(0,0)的转换总是有’应该’或’根据’。(例如here)。实际的差别是什么,为什么会改变输出这么多?
N.B:这发生在大多数(如果不是全部)Internet Explorer版本中。我们也知道它发生在一些版本的Firefox。但是Chrome和Safari不显示这种行为,导致我们相信在-webkit中有一些补丁。
为了能够提交这个bug,我们需要使用最少的代码重现问题。所以,从我的其他问题转移,这里是使用透明vs rgba(0,0)的比较,当我们使用两者时会发生什么。
透明
@keyframes spin{ 0% {transform:rotateZ(0deg);} 50% {transform:rotateZ(360deg);border-radius:60%;} 100%{transform:rotateZ(720deg);} } .spinme{ display:inline-block; position:relative; left:0; top:0; margin:0.2rem; width:0.8rem; height:0.8rem; border:0.2rem solid black; border-radius:0%; outline: 1px solid transparent; transform:rotateZ(0deg); animation: spin infinite 4s; }
<div></div>
RGBA(0,0)
@keyframes spin{ 0% {transform:rotateZ(0deg);} 50% {transform:rotateZ(360deg);border-radius:60%;} 100%{transform:rotateZ(720deg);} } .spinme{ display:inline-block; position:relative; left:0; top:0; margin:0.2rem; width:0.8rem; height:0.8rem; border:0.2rem solid black; border-radius:0%; outline: 1px solid rgba(0,0); transform:rotateZ(0deg); animation: spin infinite 4s; }
<div></div>
都
正如@andyb所指出的,当在单独的元素上使用时,有奇怪的行为。你会期望只有一个摇摆,但他们都做。如图所示:
@keyframes spin{ 0% {transform:rotateZ(0deg);} 50% {transform:rotateZ(360deg);border-radius:60%;} 100%{transform:rotateZ(720deg);} } .spinme{ display:inline-block; position:relative; left:0; top:0; margin:0.2rem; width:0.8rem; height:0.8rem; border:0.2rem solid black; border-radius:0%; outline: 1px solid rgba(0,0); transform:rotateZ(0deg); animation: spin infinite 4s; } .spinme:nth-of-type(2){ outline: 1px solid transparent; }
<div></div> <div></div>
对于那些不能在Internet Explorer中测试这里,这里是一个动画的.gif的问题:
这是在左边透明,在中间rgba,和在右边。
正如@Abhitalks所指出的,我错读了参考文献,但是我将在问题中留下下面的内容,以表明我们已经考虑过这种可能性,或者如果某些东西被遗漏/被忽略。
感谢@ juan-c-v的答案,我决定尝试创建一个测试,以找到计算的值在每个浏览器的透明,并提出了以下:
$('p').text($('p').css("background-color"));
p{background-color:transparent;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <p></p>
如果你在Chrome / Safari中查看这个,那么你很可能会看到(如果你没有评论的话)rgba(0,0)。但在IE中,你可能会看到透明的静止。我正在阅读MSDN参考,发现:
The transparent keyword is not supported.
这解释了为什么浏览器显示不同的结果。然而,它不解释任何地方他们的版本的透明实际上定义为。我浏览了旧的CSS1和CSS2 w3c规格,找不到一个旧的定义。透明是什么意思?
解决方法
另一方面,“transparent”是一个CSS属性,它标识一个项目将是完全透明的,而不进行颜色和alpha的计算。作为一个CSS属性而不是一个函数,每个浏览器以不同的方式应用它,因此它与浏览器应用此属性使用的方法有很大不同。
编辑
好吧,你说我矛盾在我的答案:
transparent
Fully transparent. This keyword can be considered a shorthand for
transparent black,which is its computed value.
嗯,我不矛盾。一件事是W3C标准的规范,另一件事是不同浏览器的开发者对该标准的实现。我不会打破IE的代码来证明我在说什么,因为它有点非法,直接问微软的家伙看到他们的答案。
我告诉你的是,他们是浏览器,不处理透明和rgba(0,0,0,0)在同样的方式。这是因为透明属性比rgba(0,0,0,0)函数更老(你喜欢比rgba()更多?),最有可能的是,虽然为IE开发了一个有效的方法为rgba g,b,a),他们仍然使用具有透明属性的旧方法。
你总是要记住的一件事是,没有web浏览器满足W3C标准到100%,这就是为什么在大多数新的属性必须添加制造商的特定扩展(moz- webkit-等)
想想为什么这么荒谬的写同样的事情四次,当一切都将使用标准属性解决,你自己会回答,因为它是不一样的使用透明和rgba(0,0,0,0)在IE 。
关于super和和Parent类名称之间有什么区别?的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于bool()和operator.truth()之间有什么区别?、clock(),gettickcount(),QueryPerformanceCounter()和QueryPerformanceFrequency()之间有什么区别?、css – parent *:hover {}和parent:hover * {}之间有什么区别?、css – rgba(0,0,0,0)和transparent之间有什么区别?等相关内容,可以在本站寻找。
本文标签: