GVKun编程网logo

super()和Parent类名称之间有什么区别?(super.和super()区别)

5

本文的目的是介绍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()区别)

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__AD.__init__;
  • super().__init__DB.__init__;
  • super().__init__BC.__init__;
  • super().__init__CE.__init__;
  • super().__init__EG.__init__;
  • super().__init__GH.__init__;
  • super().__init__HF.__init__; 和
  • super().__init__Fobject.__init__

因此请注意,super()本身 并不 委托给父母
。例如,super()ofDBandB不是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__DE.__init__;
  • super().__init__EG.__init__;
  • super().__init__GH.__init__;
  • super().__init__HF.__init__; 和
  • super().__init__Fobject.__init__

因此,这里 super()D导致E(对于__init__这是 不是在上下文中的相同A

bool()和operator.truth()之间有什么区别?

bool()和operator.truth()之间有什么区别?

bool()operator.truth()两个测试值是否
truthyfalsy ,他们似乎从文档颇为相似,它甚至说,在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()在不带参数的情况下调用returns
Falsewhiletruth()需要一个参数。2)bool()接受x关键字参数,例如bool(x=1),而truth()没有关键字参数。bool()对于常规用例,这两者都会增加开销。

关键字的实现很奇怪,因为可能没有人需要它,而且名称x几乎没有描述性。Issue29695涵盖了这一点,实际上,该问题不仅影响到bool()其他类,例如int()list()。但是,从Python
3.7开始,这些关键字参数将被删除,并且速度应会提高。尽管如此,我还是在最新的Python
3.8分支上测试了时序,并且bool()比以前更快,但仍比以前快两倍truth(),这可能是由于的实现更为通用bool()

因此,如果您的任务非常重视速度,那么我建议您在需要函数的情况下使用truth()over
bool()(例如,解析为的键sorted())。但是,正如khelwood所指出的那样,bool()有时还是会更快filter(bool,iterable),所以最好将您的用例确定为最佳选择。

当然,如果您不需要功能,而只想测试值是 还是 ,则应使用惯用语ififnot语句,如khelwood和ser2357112所评论的那样,这是最快的。

clock(),gettickcount(),QueryPerformanceCounter()和QueryPerformanceFrequency()之间有什么区别?

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 * {}之间有什么区别?

css – parent *:hover {}和parent:hover * {}之间有什么区别?

我想知道CSS选择器之间有什么区别.
如果我改变这个:

.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”定位任何元素的所有后代,而处于悬停状态“(即,当后代悬停时)
> .parent:hover * {}表示使用class =“parent”定位任何元素的所有后代,而class =“parent”的元素处于悬停状态(请注意,如果后代元素悬停,那么.parent,即使它们不形成单个有凝聚力的视觉单元(例如,位置:绝对正在使用).

如果您的< div class =“parent”>有多个孩子然后第一个规则(.parent *:hover {})只会影响单个后代,而特定的后代是悬停的 – 所以如果用户鼠标悬停另一个元素,那么样式规则将会改变.

第二个规则就是如果.parent是鼠标悬停的话,那么所有后代都会改变它们的样式.这不是一个好的样式规则,因为后代选择器将选择.parent下的所有内容(例如,每个< span>,< a>,< p>等).您可能应该使用更具体的选择器.

css – rgba(0,0,0,0)和transparent之间有什么区别?

css – rgba(0,0,0,0)和transparent之间有什么区别?

在 one of my other questions,修复渲染问题的解决方案是使用值rgba(255,255,255,255)而不是透明。我们测试使用rgba(0,0,0,0),这仍然纠正了这个问题,这意味着它是透明的定义导致错误。然而,查看 W3C CSS3 Specification(和 MDN reference)的透明度显示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规格,找不到一个旧的定义。透明是什么意思?

解决方法

rgba()是一个计算一个项目的颜色和透明度的函数,当你想要控制一个项目的颜色和alpha时,这是非常有用的,尤其是如果你不想完全透明。作为一个函数,你告诉浏览器你想要绘制的项目的颜色和透明度,这是更接近JS比CSS。

另一方面,“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之间有什么区别?等相关内容,可以在本站寻找。

本文标签: