目次
Python 上級 - 継承における MRO と Super
前に書いてあります
1. 单继承中父类方法调用
1.1 非绑定方式调用
1.2 builtin 函数 super
1.3 绑定方式调用
2. 深入super
2.1 复杂的多继承
2.2 方法解析顺序(MRO)
1.1 ノンバインディングモードでの呼び出し
1.2 組み込み関数 super
1.3 バインディング メソッドの呼び出し
2.1 複雑な多重継承
2.2 メソッド解決順序 (MRO)
2.3 再看super方法
3. 最佳实践
3.1 不可预测的调用
3.2 实践建议
3.3 参数匹配
3.4 保证方法存在
3.5 组合不友好的类
参考
ホームページ バックエンド開発 Python チュートリアル 継承におけるMROとスーパーについて詳しく解説

継承におけるMROとスーパーについて詳しく解説

Jun 30, 2017 pm 01:31 PM
python super

Python 上級 - 継承における MRO と Super

前に書いてあります

特に明記されていない限り、以下は Python3 に基づいています

要約
この記事では、Pythonで継承関係を渡す方法について説明します> super() は「親クラス」メソッドを呼び出し、super(Type, CurrentClass)CurrentClassMRO を返します。 Type の次のクラスのプロキシと、正しく初期化されるように Python クラスを設計する方法。 Python继承关系中如何通过super()调用“父类”方法,super(Type, CurrentClass)返回CurrentClassMROType的下一个类的代理;以及如何设计Python类以便正确初始化。

1. 单继承中父类方法调用

在继承中,调用父类方法是很有必要的。调用父类方法的场景有很多:

  • 比如必须调用父类的构造方法__init__才能正确初始化父类实例属性,使得子类实例对象能够继承到父类实例对象的实例属性;

  • 再如需要重写父类方法时,有时候没有必要完全摒弃父类实现,只是在父类实现前后加一些实现,最终还是要调用父类方法

单继承是最简单的继承关系,多继承过于复杂,而且使用起来容易出错。因此一些高级语言完全摒弃了多继承,只支持单继承;一些高级语言虽然支持多继承,但也不推荐使用多继承。Python也是一样,在不能完全掌握多继承时,最好不好使用,单继承能满足绝大部分的需求。

1.1 非绑定方式调用

绑定方法与非绑定方法的区别与联系参见:Python基础-类

如有以下继承关系两个类:

class D(object):def test(self):print('test in D')class C(D):def test(self):print('test in C')
        D.test(self)
ログイン後にコピー

现在要求在子类Ctest函数中调用父类Dtest实现。我们能想到最直接的方法恐怕是直接引用类对象D的函数成员test了:

class D(object):def test(self):print('test in D')class C(D):def test(self):print('test in C')
ログイン後にコピー

尝试测试一下:

c = C()
c.test()
ログイン後にコピー

output:

test in C
test in D
ログイン後にコピー

看来非绑定的方式确实满足了当前调用父类方法的需求。

1.2 builtin 函数 super

参考Python tutorial关于super的描述: super([type[, object-or-type]])

Return a proxy object that delegates method calls to a parent or sibling class of type. This is useful for accessing inherited methods that have been overridden in a class. The search order is same as that used by getattr() except that the type itself is skipped.

super函数返回委托类type的父类或者兄弟类方法调用的代理对象。super用来调用已经在子类中重写了的父类方法。方法的搜索顺序与getattr()函数相同,只是参数类type本身被忽略。

1.3 绑定方式调用

使用绑定方式调用父类方法,自然不能显式传入参数当前对象(self)。现在super函数能够范围对父类的代理,因为在单继承中子类有且仅有一个父类,所以父类是明确的,我们完全清楚调用的父类方法是哪个:

class D(object):def test(self):print('test in D')class C(D):def test(self):print('test in C')super().test() # super(C, self).test()的省略形式
ログイン後にコピー

2. 深入super

事实上,super函数返回的代理对象是一个bultin class super,正如它的名字所指,类super代理了子类的父类。在单继承关系中,super代理的类很容易找到吗,就是子类的唯一父类;但是在多继承关系中,super除了能代理子类的父类外,还有可能代理子类的兄弟类。

2.1 复杂的多继承

在多继承关系中,继承关系可能会相当复杂。

class D(object):    def test(self):print('test in D')class C(D):    def test(self):print('test in C')class B(D):    def test(self):print('test in B')class A(B, C):pass
ログイン後にコピー

A继承层次结构如下:

  object
    |
    D
   / \
  B   C
   \ /
    A
ログイン後にコピー

A的继承关系中存在菱形结构,即可以通过多条路径从类A到达某个父类,这里是D

如果现在要求在类A中调用“父类”的test方法,需要一种对test方法的搜索解析顺序,来决定到底是调用B,C或Dtest方法。

2.2 方法解析顺序(MRO)

上面提出的对test的方法的搜索顺序,就是方法解析顺序了。

深度优先
Python旧式类中,方法解析顺序是深度优先,多个父类从左到右。
广度优先
Python新式类中,方法解析顺序是广度优先,多个父类从左到右。

所以上面的解析顺序是:A -> B -> C -> D -> object

Python中,类的__mro__属性展示了方法搜索顺序,可以调用mro()方法或者直接引用__mro__

1. 単一継承での親クラスのメソッドの呼び出し
継承では、親クラスのメソッドを呼び出す必要があります。親クラスのメソッドを呼び出すシナリオは数多くあります: 🎜
  • 🎜たとえば、親クラスのコンストラクター メソッド __init__ を正しく初期化するには、親クラスのコンストラクター メソッド __init__ を呼び出す必要があります。親クラスのインスタンス属性。サブクラスのインスタンス オブジェクトが親クラスのインスタンス オブジェクトのインスタンス属性を継承できるようにします。 🎜
  • 🎜 親クラスのメソッドを完全に破棄する必要がない場合があります。親クラスの実装は、親クラスに実装するだけです 前後にいくつかの実装を追加した後、引き続き親クラスのメソッドを呼び出す必要があります🎜
🎜単一継承は最も単純な継承関係です。多重継承も同様です。使い方が複雑で間違いが起こりやすい。したがって、一部の高級言語は多重継承を完全に放棄し、単一継承のみをサポートします。ただし、一部の高級言語は多重継承をサポートしますが、多重継承は推奨されません。 Python についても同様です。多重継承を完全にマスターできない場合は、ほとんどのニーズを満たすことができる単一継承を使用しないことをお勧めします。 🎜
1.1 ノンバインディングモードでの呼び出し
🎜バインドメソッドとノンバインディングメソッドの違いや関連性については、Pythonの基礎 - クラスを参照してください🎜🎜以下の継承関係を持つクラスが2つある場合:🎜🎜
print(A.mro())print(A.__mro__)
ログイン後にコピー
🎜🎜今度は、サブクラス test 関数で、親クラス Dtest 実装を呼び出す必要があります。 >C。私たちが考える最も直接的な方法は、おそらくクラス オブジェクト D の関数メンバー test を直接参照することです: 🎜🎜
[<class &#39;__main__.A&#39;>, <class &#39;__main__.B&#39;>, <class &#39;__main__.C&#39;>, <class &#39;__main__.D&#39;>, <class &#39;object&#39;>]
(<class &#39;__main__.A&#39;>, <class &#39;__main__.B&#39;>, <class &#39;__main__.C&#39;>, <class &#39;__main__.D&#39;>, <class &#39;object&#39;>)
ログイン後にコピー
ログイン後にコピー
🎜🎜テストしてみてください: 🎜🎜
a = A()
a.test() # output: test in B
ログイン後にコピー
ログイン後にコピー
🎜🎜出力: 🎜🎜
class D(object):    def test(self):print(&#39;test in D&#39;)class C(D):    def test(self):print(&#39;test in C&#39;)class B(D):    def test(self):print(&#39;test in B&#39;)
ログイン後にコピー
ログイン後にコピー
🎜🎜非バインドメソッドは、親クラスのメソッドを呼び出す現在のニーズを満たしているようです。 🎜
1.2 組み込み関数 super
🎜 Python チュートリアルの super の説明を参照してください: super([type[, object-or-type]])🎜🎜🎜 プロキシ オブジェクトを返しますこれは、型の親クラスまたは兄弟クラスにメソッド呼び出しを委任します。これは、クラス内でオーバーライドされた継承メソッドにアクセスする場合に便利です。ただし、型自体がスキップされる点を除き、検索順序は getattr() で使用されるものと同じです。 🎜🎜 super 関数は、デリゲート クラス type の親クラスまたは兄弟クラスのメソッドによって呼び出されるプロキシ オブジェクトを返します。 super は、サブクラスでオーバーライドされた親クラスのメソッドを呼び出すために使用されます。メソッドの検索順序は、パラメータ クラス type 自体が無視される点を除いて、getattr() 関数の場合と同じです。 🎜
1.3 バインディング メソッドの呼び出し
🎜 バインディング メソッドを使用して親クラスのメソッドを呼び出す場合、当然のことながら、パラメーターの現在のオブジェクト (self) を明示的に渡すことはできません。 super 関数は、親クラスのプロキシをスコープできるようになりました。単一継承では、サブクラスには親クラスが 1 つしかないため、親クラスが明確になり、どの親クラス メソッドが存在するのかが完全にわかります。 :🎜🎜
  object
    |
    D
   / \
  C   B
ログイン後にコピー
ログイン後にコピー
🎜🎜 2. super🎜🎜 の詳細へ 実際、super 関数によって返されるプロキシ オブジェクトは、その名前が示すように bultin class super です。 、クラス < code>super はサブクラスの親クラスを表します。単一継承関係では、super が表すクラスを見つけるのは簡単ですか? それはサブクラスの唯一の親クラスですが、多重継承関係では、super は見つけることができます。サブクラスのプロキシだけでなく、親クラスに加えて、サブクラスの兄弟クラスもプロキシすることができます。 🎜
2.1 複雑な多重継承
🎜 多重継承関係では、継承関係が非常に複雑になる場合があります。 🎜🎜
class D(object):    def test(self):print(&#39;test in D&#39;)class C(D):    def test(self):print(&#39;test in C&#39;)super().test()class B(D):    def test(self):print(&#39;test in B&#39;)super().test()class A(B, C):passb = B()
b.test()print(&#39;==========&#39;)
a = A()
a.test()
ログイン後にコピー
ログイン後にコピー
🎜🎜クラス A の継承階層は次のとおりです: 🎜
test in B
test in D==========test in B
test in C
test in D
ログイン後にコピー
ログイン後にコピー
🎜 クラス A の継承関係にはダイヤモンド構造があります。クラス A からの複数のパスが特定の親クラス (この場合は D) に到達します。 🎜🎜クラス A の "🎜親クラス🎜" の test メソッドを呼び出す必要がある場合、< code>test< /code> メソッドの検索と解析の順序は、B、C、または Dtest メソッドを呼び出すかどうかを決定するために使用されます。 🎜
2.2 メソッド解決順序 (MRO)
🎜 上記で提案した test のメソッドの検索順序がメソッド解決順序です。 🎜🎜🎜深さ優先🎜🎜Python古いスタイルのクラスでは、メソッドの解析順序は深さ優先で、複数の親クラスは左から右になります。 🎜🎜幅優先🎜🎜 Python の新しいスタイルのクラスでは、メソッド解決の順序は幅優先で、複数の親クラスは左から右になります。 🎜🎜上記の解析順序は、A -> B -> C -> D -> です。 🎜🎜 Python では、クラスの __mro__ 属性は、mro() メソッドを呼び出すか、< を直接参照できます。 code>__mro__< /code>検索順を取得: 🎜🎜
def super(cls, inst):
    mro = inst.__class__.mro() # Always the most derived classreturn mro[mro.index(cls) + 1]
ログイン後にコピー
ログイン後にコピー
🎜

output:

[<class &#39;__main__.A&#39;>, <class &#39;__main__.B&#39;>, <class &#39;__main__.C&#39;>, <class &#39;__main__.D&#39;>, <class &#39;object&#39;>]
(<class &#39;__main__.A&#39;>, <class &#39;__main__.B&#39;>, <class &#39;__main__.C&#39;>, <class &#39;__main__.D&#39;>, <class &#39;object&#39;>)
ログイン後にコピー
ログイン後にコピー

所以

a = A()
a.test() # output: test in B
ログイン後にコピー
ログイン後にコピー

变化的MRO
即使是同一个类,在不同的MRO中位置的前后关系都是不同的。如以下类:

class D(object):    def test(self):print(&#39;test in D&#39;)class C(D):    def test(self):print(&#39;test in C&#39;)class B(D):    def test(self):print(&#39;test in B&#39;)
ログイン後にコピー
ログイン後にコピー

B的继承层次结构为:

  object
    |
    D
   / \
  C   B
ログイン後にコピー
ログイン後にコピー

B的MRO:B -> D -> object
对比类A的MRO:A -> B -> C -> D -> object
同样的类B,在两个不同的MRO中位置关系也是不同的。可以说,在已有的继承关系中加入新的子类,会在MRO中引入新的类,并且改变解析顺序。

那么可以想象,同样在类B的test中通过super调用父类方法,在不同的MRO中实际调用的方法是不同的。

如下:

class D(object):    def test(self):print(&#39;test in D&#39;)class C(D):    def test(self):print(&#39;test in C&#39;)super().test()class B(D):    def test(self):print(&#39;test in B&#39;)super().test()class A(B, C):passb = B()
b.test()print(&#39;==========&#39;)
a = A()
a.test()
ログイン後にコピー
ログイン後にコピー

output:

test in B
test in D==========test in B
test in C
test in D
ログイン後にコピー
ログイン後にコピー

因为在原有的类关系中加入BC的子类A,使得在Btest方法中调用supertest方法发生了改变,原来调用的是其父类Dtest方法,现在调用的是其兄弟类Ctest方法。
从这里可以看出super不总是代理子类的父类,还有可能代理其兄弟类。

因此在设计多继承关系的类体系时,要特别注意这一点。

2.3 再看super方法

方法super([type[, object-or-type]]),返回的是对type的父类或兄弟类的代理。
如果第二个参数省略,返回的super对象是未绑定到确定的MRO上的:

  • 如果第二个参数是对象,那么isinstance(obj, type)必须为True

  • 如果第二个参数是类型,那么issubclass(type2, type)必须为True,即第二个参数类型是第一个参数类型的子类。

super函数的第二个参数存在时,其实现大概如以下:

def super(cls, inst):
    mro = inst.__class__.mro() # Always the most derived classreturn mro[mro.index(cls) + 1]
ログイン後にコピー
ログイン後にコピー

很明显,super返回在第二个参数对应类的MRO列表中,第一个参数type的下一个类的代理。因此,要求第一个参数type存在于第二个参数类的MRO是必要的,只有第一个参数类是第二个参数所对应类的父类,才能保证。

super()
super函数是要求有参数的,不存在无参的super函数。在类定义中以super()方式调用,是一种省略写法,由解释器填充必要参数。填充的第一个参数是当前类,第二个参数是self

super() => super(current_class, self)
ログイン後にコピー

所以,super()这种写法注定只能在类定义中使用。

现在再来看上面的继承关系:

class D(object):def test(self):print(&#39;test in D&#39;)class C(D):def test(self):print(&#39;test in C&#39;)# super().test() # 与下面的写法等价super(C, self).test() # 返回self对应类的MRO中,类C的下一个类的代理class B(D):def test(self):print('test in B')# super().test() # 与下面的写法等价super(B, self).test() # 返回self对应类的MRO中,类B的下一个类的代理class A(B, C):pass
ログイン後にコピー

因此:

b = B()
b.test() # 基于类B的MRO(B->D->object),类B中的super()代理Dprint(&#39;==========&#39;)
a = A()
a.test() # 基于类A的MRO(A->B->C->D->object),类B中的super()代理C
ログイン後にコピー

以上就是在继承关系中引入新类,改变方法解析顺序的实例。

super([type[, object-or-type]])的第二个参数,对象和类还有一点区别:使用对象返回的是代理使用绑定方法,使用类返回的代理使用非绑定方法。
如:

b = B()super(B, b).test()super(B, B).test(b)
ログイン後にコピー

这两种方式得到的结果是相同的,区别在于非绑定调用与绑定调用。

3. 最佳实践

3.1 不可预测的调用

普通的函数或者方法调用中,调用者肯定事先知道被调用者所需的参数,然后可以轻松的组织参数调用。但是在多继承关系中,情况有些尴尬,使用super代理调用方法,编写类的作者并不知道最终会调用哪个类的方法,这个类都可能尚未存在。

如现在一作者编写了以下类:

class D(object):def test(self):print(&#39;test in D&#39;)        
class B(D):def test(self):print(&#39;test in B&#39;)super().test()
ログイン後にコピー

在定义类D时,作者完全不可能知道test方法中的super().test()最终会调用到哪个类。
因为如果后来有人在这个类体系的基础上,引入了如下类:

class C(D):def test(self):print(&#39;test in C&#39;)super().test()        
class A(B, C):passa = A()
a.test()
ログイン後にコピー

此时会发现类Btest方法中super().test()调用了非原作者编写的类的方法。
这里test方法的参数都是确定的,但是在实际生产中,可能各个类的test方法都是不同的,如果新引入的类C需要不同的参数:

class C(D):def test(self, param_c):print(&#39;test in C, param is&#39;, param_c)super().test()        
class A(B, C):passa = A()
a.test()
ログイン後にコピー

B的调用方式调用类Ctest方法肯定会失败,因为没有提供任何参数。类C的作者是不可能去修改类B的实现。那么,如何适应这种参数变换的需求,是在设计Python类中需要考虑的问题。

3.2 实践建议

事实上,这种参数的变换在构造方法上能体现得淋漓尽致,如果子类没有正确初始化父类,那么子类甚至不能从父类继承到需要的实例属性。

所以,Python的类必须设计友好,才能拓展,有以下三条指导原则:

  1. 通过super()调用的方法必须存在;

  2. 调用者和被调用者参数必须匹配;

  3. 所有对父类方法的调用都必须使用super()

3.3 参数匹配

super()代理的类是不可预测的,需要匹配调用者和可能未知的调用者的参数。

固定参数
一种方法是使用位置参数固定函数签名。就像以上使用的test()一样,其签名是固定的,只要要传递固定的参数,总是不会出错。

关键字参数
每个类的构造方法可能需要不同的参数,这时固定参数满足不了这种需求了。幸好,Python中的关键字参数可以满足不定参数的需求。设计函数参数时,参数由关键字参数和关键字参数字典组成,在调用链中,每一个函数获取其所需的关键字参数,保留不需要的参数到**kwargs中,传递到调用链的下一个函数,最终**kwargs为空时,调用调用链中的最后一个函数。

示例:

class Shape(object):def __init__(self, shapename, **kwargs):self.shapename = shapenamesuper().__init__(**kwargs)class ColoredShape(Shape):def __init__(self, color, **kwargs):self.color = colorsuper().__init__(**kwargs)

cs = ColoredShape(color=&#39;red&#39;, shapename=&#39;circle&#39;)
ログイン後にコピー

参数的剥落步骤为:

  • 使用cs = ColoredShape(color=&#39;red&#39;, shapename=&#39;circle&#39;)初始化ColoredShape

  • ColoredShape__init__方法获取其需要的关键字参数color,此时的kwargs{shapename:&#39;circle&#39;};

  • 调用调用链中Shape__init__方法,该方法获取所需关键字参数shapename,此时kwargs{};

  • 最后调用调用链末端objet.__init__,此时因为kwargs已经为空。

初始化子类传递的关键字参数尤为重要,如果少传或多传,都会导致初始化不成功。只有MRO中每个类的方法都是用super()来调用“父类”方法时,才能保证super()调用链不会断掉。

3.4 保证方法存在

上面的例子中,由于顶层父类object总是存在__init__方法,在任何MRO链中也总是最后一个,因此任意的super().__init__调用总能保证是object.__init__结束。

但是其他自定义的方法得不到这样的保证。这时需要手动创建类似object的顶层父类:

class Root:def draw(self):# the delegation chain stops hereassert not hasattr(super(), &#39;draw&#39;)class Shape(Root):def __init__(self, shapename, **kwds):self.shapename = shapenamesuper().__init__(**kwds)def draw(self):print(&#39;Drawing.  Setting shape to:&#39;, self.shapename)super().draw()class ColoredShape(Shape):def __init__(self, color, **kwds):self.color = colorsuper().__init__(**kwds)def draw(self):print(&#39;Drawing.  Setting color to:&#39;, self.color)super().draw()

cs = ColoredShape(color=&#39;blue&#39;, shapename=&#39;square&#39;)
cs.draw()
ログイン後にコピー

如果有新的类要加入到这个MRO体系,新的子类也要继承Root,这样,所有的对draw()的调用都会经过Root,而不会到达没有draw方法的object了。这种对于子类的扩展要求,应当详细注明在文档中,便于使用者阅读。这种限制与Python所有异常都必须继承自BaseException一样。

3.5 组合不友好的类

对于那些不友好的类:

class Moveable:def __init__(self, x, y):self.x = xself.y = ydef draw(self):print(&#39;Drawing at position:&#39;, self.x, self.y)
ログイン後にコピー

如果希望使用它的功能,直接将其加入到我们友好的继承体系中,会破坏原有类的友好性。
除了通过继承获得第三方功能外,还有一种称之为组合的方式,即把第三方类作为组件的方式揉入类中,使得类具有第三方的功能:

class MoveableAdapter(Root):def __init__(self, x, y, **kwds):self.movable = Moveable(x, y)super().__init__(**kwds)def draw(self):self.movable.draw()super().draw()
ログイン後にコピー

Moveable被作为组件整合到适配类MoveableAdapter中,适配类拥有了Moveable的功能,而且是友好实现的。完全可以通过继承适配类的方式,将Moveable的功能加入到友好的继承体系中:

class MovableColoredShape(ColoredShape, MoveableAdapter):passMovableColoredShape(color=&#39;red&#39;, shapename=&#39;triangle&#39;,
                    x=10, y=20).draw()
ログイン後にコピー

参考

Python’s super() considered super!
Python tutorial#super

以上が継承におけるMROとスーパーについて詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

C言語合計の機能は何ですか? C言語合計の機能は何ですか? Apr 03, 2025 pm 02:21 PM

C言語に組み込みの合計機能はないため、自分で書く必要があります。合計は、配列を通過して要素を蓄積することで達成できます。ループバージョン:合計は、ループとアレイの長さを使用して計算されます。ポインターバージョン:ポインターを使用してアレイ要素を指し示し、効率的な合計が自己概要ポインターを通じて達成されます。アレイバージョンを動的に割り当てます:[アレイ]を動的に割り当ててメモリを自分で管理し、メモリの漏れを防ぐために割り当てられたメモリが解放されます。

独特の目標は関連していますか? 独特の目標は関連していますか? Apr 03, 2025 pm 10:30 PM

明確で明確なものは区別に関連していますが、それらは異なる方法で使用されます。明確な(形容詞)は、物事自体の独自性を説明し、物事の違いを強調するために使用されます。明確な(動詞)は、区別の動作または能力を表し、差別プロセスを説明するために使用されます。プログラミングでは、個別は、重複排除操作などのコレクション内の要素の独自性を表すためによく使用されます。明確なは、奇数や偶数の偶数を区別するなど、アルゴリズムまたは関数の設計に反映されます。最適化する場合、異なる操作は適切なアルゴリズムとデータ構造を選択する必要がありますが、異なる操作は、論理効率の区別を最適化し、明確で読み取り可能なコードの書き込みに注意を払う必要があります。

誰がより多くのPythonまたはJavaScriptを支払われますか? 誰がより多くのPythonまたはJavaScriptを支払われますか? Apr 04, 2025 am 12:09 AM

スキルや業界のニーズに応じて、PythonおよびJavaScript開発者には絶対的な給与はありません。 1. Pythonは、データサイエンスと機械学習でさらに支払われる場合があります。 2。JavaScriptは、フロントエンドとフルスタックの開発に大きな需要があり、その給与もかなりです。 3。影響要因には、経験、地理的位置、会社の規模、特定のスキルが含まれます。

Cで理解する方法!x? Cで理解する方法!x? Apr 03, 2025 pm 02:33 PM

!X理解!Xは、C言語の論理的な非操作者です。 Xの値をブーリングします。つまり、虚偽の真の変化、trueへの誤った変更です。ただし、Cの真実と虚偽はブール型ではなく数値で表されていることに注意してください。非ゼロは真であると見なされ、0のみが偽と見なされます。したがって、!xは正の数と同じ負の数を扱い、真実と見なされます。

c言語でsumとはどういう意味ですか? c言語でsumとはどういう意味ですか? Apr 03, 2025 pm 02:36 PM

Cには組み込みの合計関数はありませんが、次のように実装できます。ループを使用して要素を1つずつ蓄積します。ポインターを使用して、要素に1つずつアクセスして蓄積します。大量のデータ量については、並列計算を検討してください。

H5ページの生産には継続的なメンテナンスが必要ですか? H5ページの生産には継続的なメンテナンスが必要ですか? Apr 05, 2025 pm 11:27 PM

H5ページは、コードの脆弱性、ブラウザー互換性、パフォーマンスの最適化、セキュリティの更新、ユーザーエクスペリエンスの改善などの要因のため、継続的に維持する必要があります。効果的なメンテナンス方法には、完全なテストシステムの確立、バージョン制御ツールの使用、定期的にページのパフォーマンスの監視、ユーザーフィードバックの収集、メンテナンス計画の策定が含まれます。

ラブコードのコピーをコピーして貼り付けて無料でラブコードを貼り付けます ラブコードのコピーをコピーして貼り付けて無料でラブコードを貼り付けます Apr 04, 2025 am 06:48 AM

コードのコピーと貼り付けは不可能ではありませんが、注意して扱う必要があります。コード内の環境、ライブラリ、バージョンなどの依存関係は、現在のプロジェクトと一致しないため、エラーや予測不可能な結果が得られます。ファイルパス、従属ライブラリ、Pythonバージョンなど、コンテキストが一貫していることを確認してください。さらに、特定のライブラリのコードをコピーして貼り付けるときは、ライブラリとその依存関係をインストールする必要がある場合があります。一般的なエラーには、パスエラー、バージョンの競合、一貫性のないコードスタイルが含まれます。パフォーマンスの最適化は、コードの元の目的と制約に従って再設計またはリファクタリングする必要があります。コピーされたコードを理解してデバッグすることが重要であり、盲目的にコピーして貼り付けないでください。

58.com作業ページでリアルタイムアプリケーションと視聴者のデータを取得する方法は? 58.com作業ページでリアルタイムアプリケーションと視聴者のデータを取得する方法は? Apr 05, 2025 am 08:06 AM

クロール中に58.com作業ページの動的データを取得するにはどうすればよいですか? Crawlerツールを使用して58.comの作業ページをrawったら、これに遭遇する可能性があります...

See all articles