目次
Python で習得するのが最も難しい知識ポイントを 2 つの文で説明します - メタクラス
各組み込みのsay_xxx をクラス内で 1 回宣言する必要がある場合、それは非常に大変な作業になるでしょう。この問題を解決するには、
年轻的造物主,请随我一起开创新世界。
挑战一:通过元类创建ORM
道生一
一生二
二生三、三生万物
挑战二:网络代理的爬取
准备工作,先爬个页面玩玩
批量处理抓取代理
年轻的造物主,创造世界的工具已经在你手上,请你将它的威力发挥到极致!
ホームページ バックエンド開発 Python チュートリアル Python メタクラスとは何ですか? Python メタクラスの概要

Python メタクラスとは何ですか? Python メタクラスの概要

Sep 12, 2018 pm 03:09 PM
python メタクラス

この記事では、Python メタクラスとは何ですか? Python メタクラスの入門書は一定の参考価値がありますので、困っている友人が参考にしていただければ幸いです。

Python で習得するのが最も難しい知識ポイントを 2 つの文で説明します - メタクラス

いわゆる「メタクラスは 99% の Python プログラマーが利用する機能である」という考えに騙されないでください。使用しません」そのようなレトリックは私を怖がらせます。なぜなら、すべての中国人はメタクラスの自然なユーザーであるためです。

メタクラスについて学ぶには、次の 2 つの文を知るだけで済みます。

  • #道生一、一生二、二生三、三三生五世

  • 私は誰ですか?私はどこから来たのですか?どこに向かってるの?

    (ブロガーはこうあるべきだと考えています: 私は誰ですか? 私はどこから来たのですか? 私に何ができるのですか?)

Python の世界には、永遠のタオ、それが「型」です、覚えておいてください、型はタオです。このような広大な Python エコシステムはすべて型ごとに生成されます。

Python メタクラスとは何ですか? Python メタクラスの概要

道は一を生み、二を生み、二は三を生み、三は万物を生む。

  1. # はタイプです

  2. ##一
  3. はメタクラス (メタクラス、またはクラス ジェネレーター)

  4. # はクラス (クラス、またはインスタンス ジェネレーター)

  5. # 3 つ目はインスタンス (インスタンス)
  6. everything
  7. はインスタンスのさまざまな属性やメソッドで、通常 Python を使用するときはこれらを呼び出します。
  8. Tao と 1 は今日議論する命題であり、2、3、その他すべては私たちがよく使うクラス、インスタンス、属性、メソッドです。例として hello world を使用しましょう. :

    # 创建一个Hello类,拥有属性say_hello ----二的起源
    class Hello():
        def say_hello(self, name='world'):
            print('Hello, %s.' % name)
    
    
    # 从Hello类创建一个实例hello ----二生三
    hello = Hello()
    
    # 使用hello调用方法say_hello ----三生万物
    hello.say_hello()
    ログイン後にコピー
  9. 出力効果:
Hello, world.
ログイン後にコピー

これは、「2 は 3 を生み、3 はすべてを生む」という標準的なプロセスです。

クラスから呼び出し可能なメソッドまで、次の 2 つのステップが使用されます。

では、クラスはどこから来たのか、尋ねずにはいられません。コードの最初の行に戻ります。 class Hello は実際には、コードを理解しやすくするための関数の「意味上の省略形」です。別の書き方は次のとおりです:

def fn(self, name='world'): # 假如我们有一个函数叫fn
    print('Hello, %s.' % name)
    
Hello = type('Hello', (object,), dict(say_hello=fn)) # 通过type创建Hello class ---- 神秘的“道”,可以点化一切,这次我们直接从“道”生出了“二”
ログイン後にコピー

この書き方は、前の方法とまったく同じです。 Class Hello を作成します。効果はまったく同じです。インスタンスを作成して

# 从Hello类创建一个实例hello ----二生三,完全一样
hello = Hello()
# 使用hello调用方法say_hello ----三生万物,完全一样
hello.say_hello()
ログイン後にコピー

を呼び出してみることができます。出力効果:

Hello, world. ----调用结果完全一样。
ログイン後にコピー

最もエキサイティングな部分

を振り返ってみましょう。 Road が直接 2 つを生み出しました

:

Hello = type('Hello', (object,), dict(say_hello=fn))
ログイン後にコピー

これが Python 世界の起源である「Tao」です。これには驚かされます。 その 3 つのパラメータに注意してください。それは人類の永遠の 3 つの命題、つまり私は誰なのか、どこから来てどこへ行きたいのか、と一致します。


最初のパラメータ: 私は誰ですか。ここでは、他のものとは異なる名前が必要です。上の例では、「Hello」という名前を付けています。

  • 2 番目のパラメータ: 私の出身地

    ここで、それがどこから来たのか、つまり「親クラス」であることを知る必要があります。上の例では、親クラスは「オブジェクト」、つまり Python の非常に下級クラスです。

  • 3 番目のパラメータ: どこに行きたいですか

    ここでは、呼び出す必要があるメソッドと属性を辞書に組み込み、パラメータとして渡します。上の例では、say_hello メソッドが辞書にラップされています。

  • 3 つの永遠の命題は、すべてのクラス、すべてのインスタンス、さらにはすべてのインスタンスの属性とメソッドによってもたらされることに注目する価値があります。当然のことながら、その「作成者」である Tao と Yi、つまりタイプとメタクラスもこれら 3 つのパラメーターを持っています。ただし、通常、クラスの 3 つの永遠の命題はパラメーターとして渡されず、次のように渡されます。

    class Hello(object){
    # class 后声明“我是谁”
    # 小括号内声明“我来自哪里”
    # 中括号内声明“我要到哪里去”
        def say_hello(){
            
        }
    }
    ログイン後にコピー

クリエイターは直接 1 人の人物を作成できますが、これは大変な作業です。創造主はまず「人間」という種を創造し、次に特定の個体をバッチで創造します。そして永遠の三つの命題を伝えてください。

  • 「Tao」は直接「2つ」を生成することもできますが、最初に「1つ」を生成し、その後「2つ」をバッチで生成します。
  • type はクラス (クラス) を直接生成できますが、最初にメタクラス (メタクラス) を生成し、そのメタクラスを使用してクラスを一括カスタマイズすることもできます。 (クラス)。
  • メタクラス - Tao Sheng Yi、人生 2

  • 一般的に、メタクラスは接尾辞 Metalass を付けて名前が付けられます。自動的に hello を言うことができるメタクラスが必要であると想像してください。その中のクラス メソッドに関しては、say_Hello が必要な場合もあれば、say_Hi が必要な場合もあり、say_Sayolala が必要な場合もあり、say_Nihao が必要な場合もあります。

各組み込みのsay_xxx をクラス内で 1 回宣言する必要がある場合、それは非常に大変な作業になるでしょう。この問題を解決するには、

metaclass

を使用することをお勧めします。

以下は、「挨拶」専用のメタクラスを作成するコードです:

class SayMetaClass(type):

    def __new__(cls, name, bases, attrs):
        attrs['say_'+name] = lambda self,value,saying=name: print(saying+','+value+'!')
        return type.__new__(cls, name, bases, attrs)
ログイン後にコピー
2 つの点を覚えておいてください:

1. メタクラスは「type」から派生しているため、親はクラスは型で渡す必要があります。 【

Tao は Tao を生成するため、Tao を含める必要があります

]

2、元类的操作都在 __new__中完成,它的第一个参数是将创建的类,之后的参数即是三大永恒命题:我是谁,我从哪里来,我将到哪里去。 它返回的对象也是三大永恒命题,接下来,这三个参数将一直陪伴我们。

在__new__中,我只进行了一个操作,就是

attrs['say_'+name] = lambda self,value,saying=name: print(saying+','+value+'!')
ログイン後にコピー

它跟据类的名字,创建了一个类方法。比如我们由元类创建的类叫“Hello”,那创建时就自动有了一个叫“say_Hello”的类方法,然后又将类的名字“Hello”作为默认参数saying,传到了方法里面。然后把hello方法调用时的传参作为value传进去,最终打印出来。

那么,一个元类是怎么从创建到调用的呢?
来!一起根据道生一、一生二、二生三、三生万物的准则,走进元类的生命周期吧!

# 道生一:传入type
class SayMetaClass(type):

    # 传入三大永恒命题:类名称、父类、属性
    def __new__(cls, name, bases, attrs):
        # 创造“天赋”
        attrs['say_'+name] = lambda self,value,saying=name: print(saying+','+value+'!')
        # 传承三大永恒命题:类名称、父类、属性
        return type.__new__(cls, name, bases, attrs)

# 一生二:创建类
class Hello(object, metaclass=SayMetaClass):
    pass

# 二生三:创建实列
hello = Hello()

# 三生万物:调用实例方法
hello.say_Hello('world!')
ログイン後にコピー

输出为

Hello, world!
ログイン後にコピー

注意:通过元类创建的类,第一个参数是父类,第二个参数是metaclass

普通人出生都不会说话,但有的人出生就会打招呼说“Hello”,“你好”,“sayolala”,这就是天赋的力量。它会给我们面向对象的编程省下无数的麻烦。

现在,保持元类不变,我们还可以继续创建Sayolala, Nihao类,如下:

# 一生二:创建类
class Sayolala(object, metaclass=SayMetaClass):
    pass

# 二生三:创建实列
s = Sayolala()

# 三生万物:调用实例方法
s.say_Sayolala('japan!')
ログイン後にコピー

输出

Sayolala, japan!
ログイン後にコピー

也可以说中文

# 一生二:创建类
class Nihao(object, metaclass=SayMetaClass):
    pass

# 二生三:创建实列
n = Nihao()

# 三生万物:调用实例方法
n.say_Nihao('中华!')
ログイン後にコピー

输出

Nihao, 中华!
ログイン後にコピー

再来一个小例子:

# 道生一
class ListMetaclass(type):
    def __new__(cls, name, bases, attrs):
        # 天赋:通过add方法将值绑定
        attrs['add'] = lambda self, value: self.append(value)
        return type.__new__(cls, name, bases, attrs)
        
# 一生二
class MyList(list, metaclass=ListMetaclass):
    pass
    
# 二生三
L = MyList()

# 三生万物
L.add(1)
ログイン後にコピー

现在我们打印一下L

print(L)

>>> [1]
ログイン後にコピー

而普通的list没有add()方法

L2 = list()
L2.add(1)

>>>AttributeError: 'list' object has no attribute 'add'
ログイン後にコピー

太棒了!学到这里,你是不是已经体验到了造物主的乐趣?

年轻的造物主,请随我一起开创新世界。

我们选择两个领域,一个是Django的核心思想,“Object Relational Mapping”,即对象-关系映射,简称ORM。

这是Django的一大难点,但学完了元类,一切变得清晰。你对Django的理解将更上一层楼!

另一个领域是爬虫领域(黑客领域),一个自动搜索网络上的可用代理,然后换着IP去突破别的人反爬虫限制。

这两项技能非常有用,也非常好玩!

挑战一:通过元类创建ORM

准备工作,创建一个Field类

class Field(object):

    def __init__(self, name, column_type):
        self.name = name
        self.column_type = column_type

    def __str__(self):
        return &#39;<%s:%s>&#39; % (self.__class__.__name__, self.name)
ログイン後にコピー

它的作用是
在Field类实例化时将得到两个参数,name和column_type,它们将被绑定为Field的私有属性,如果要将Field转化为字符串时,将返回“Field:XXX” , XXX是传入的name名称。

准备工作:创建StringField和IntergerField

class StringField(Field):

    def __init__(self, name):
        super(StringField, self).__init__(name, &#39;varchar(100)&#39;)

class IntegerField(Field):

    def __init__(self, name):
        super(IntegerField, self).__init__(name, &#39;bigint&#39;)
ログイン後にコピー

它的作用是
在StringField,IntegerField实例初始化时,时自动调用父类的初始化方式。

道生一

class ModelMetaclass(type):

    def __new__(cls, name, bases, attrs):
        if name==&#39;Model&#39;:
            return type.__new__(cls, name, bases, attrs)
        print(&#39;Found model: %s&#39; % name)
        mappings = dict()
        for k, v in attrs.items():
            if isinstance(v, Field):
                print(&#39;Found mapping: %s ==> %s&#39; % (k, v))
                mappings[k] = v
        for k in mappings.keys():
            attrs.pop(k)
        attrs[&#39;__mappings__&#39;] = mappings # 保存属性和列的映射关系
        attrs[&#39;__table__&#39;] = name # 假设表名和类名一致
        return type.__new__(cls, name, bases, attrs)
ログイン後にコピー

它做了以下几件事

  1. 创建一个新的字典mapping

  2. 将每一个类的属性,通过.items()遍历其键值对。如果值是Field类,则打印键值,并将这一对键值绑定到mapping字典上。

  3. 将刚刚传入值为Field类的属性删除。

  4. 创建一个专门的__mappings__属性,保存字典mapping。

  5. 创建一个专门的__table__属性,保存传入的类的名称。

一生二

class Model(dict, metaclass=ModelMetaclass):

    def __init__(self, **kwarg):
        super(Model, self).__init__(**kwarg)

    def __getattr__(self, key):
        try:
            return self[key]
        except KeyError:
            raise AttributeError("&#39;Model&#39; object has no attribute &#39;%s&#39;" % key)

    def __setattr__(self, key, value):
        self[key] = value

    # 模拟建表操作
    def save(self):
        fields = []
        args = []
        for k, v in self.__mappings__.items():
            fields.append(v.name)
            args.append(getattr(self, k, None))
        sql = &#39;insert into %s (%s) values (%s)&#39; % (self.__table__, &#39;,&#39;.join(fields), &#39;,&#39;.join([str(i) for i in args]))
        print(&#39;SQL: %s&#39; % sql)
        print(&#39;ARGS: %s&#39; % str(args))
ログイン後にコピー

如果从Model创建一个子类User:

class User(Model):
    # 定义类的属性到列的映射:
    id = IntegerField(&#39;id&#39;)
    name = StringField(&#39;username&#39;)
    email = StringField(&#39;email&#39;)
    password = StringField(&#39;password&#39;)
ログイン後にコピー

这时
id= IntegerField('id')就会自动解析为:

Model.__setattr__(self, 'id', IntegerField('id'))

因为IntergerField('id')是Field的子类的实例,自动触发元类的__new__,所以将IntergerField('id')存入__mappings__并删除这个键值对。

二生三、三生万物

当你初始化一个实例的时候并调用save()方法时候

u = User(id=12345, name=&#39;Batman&#39;, email=&#39;batman@nasa.org&#39;, password=&#39;iamback&#39;)
u.save()
ログイン後にコピー

这时先完成了二生三的过程:

  1. 先调用Model.__setattr__,将键值载入私有对象

  2. 然后调用元类的“天赋”,ModelMetaclass.__new__,将Model中的私有对象,只要是Field的实例,都自动存入u.__mappings__。

接下来完成了三生万物的过程:

通过u.save()模拟数据库存入操作。这里我们仅仅做了一下遍历__mappings__操作,虚拟了sql并打印,在现实情况下是通过输入sql语句与数据库来运行。

输出结果为

Found model: User
Found mapping: name ==> <StringField:username>
Found mapping: password ==> <StringField:password>
Found mapping: id ==> <IntegerField:id>
Found mapping: email ==> <StringField:email>
SQL: insert into User (username,password,id,email) values (Batman,iamback,12345,batman@nasa.org)
ARGS: [&#39;Batman&#39;, &#39;iamback&#39;, 12345, &#39;batman@nasa.org&#39;]
ログイン後にコピー
  • 年轻的造物主,你已经和我一起体验了由“道”演化“万物”的伟大历程,这也是Django中的Model版块核心原理。

  • 接下来,请和我一起进行更好玩的爬虫实战(嗯,你现在已经是初级黑客了):网络代理的爬取吧!

挑战二:网络代理的爬取

准备工作,先爬个页面玩玩

请确保已安装requests和pyquery这两个包。

# 文件:get_page.py
import requests

base_headers = {
    &#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36&#39;,
    &#39;Accept-Encoding&#39;: &#39;gzip, deflate, sdch&#39;,
    &#39;Accept-Language&#39;: &#39;zh-CN,zh;q=0.8&#39;
}


def get_page(url):
    headers = dict(base_headers)
    print(&#39;Getting&#39;, url)
    try:
        r = requests.get(url, headers=headers)
        print(&#39;Getting result&#39;, url, r.status_code)
        if r.status_code == 200:
            return r.text
    except ConnectionError:
        print(&#39;Crawling Failed&#39;, url)
        return None
ログイン後にコピー

这里,我们利用request包,把百度的源码爬了出来。

试一试抓百度

把这一段粘在get_page.py后面,试完删除

if(__name__ == &#39;__main__&#39;):
    rs = get_page(&#39;https://www.baidu.com&#39;)
    print(&#39;result:\r\n&#39;, rs)
ログイン後にコピー

试一试抓代理

把这一段粘在get_page.py后面,试完删除

if(__name__ == &#39;__main__&#39;):
    from pyquery import PyQuery as pq
    start_url = &#39;http://www.proxy360.cn/Region/China&#39;
    print(&#39;Crawling&#39;, start_url)
    html = get_page(start_url)
    if html:
        doc = pq(html)
        lines = doc(&#39;p[name="list_proxy_ip"]&#39;).items()
        for line in lines:
            ip = line.find(&#39;.tbBottomLine:nth-child(1)&#39;).text()
            port = line.find(&#39;.tbBottomLine:nth-child(2)&#39;).text()
            print(ip+&#39;:&#39;+port)
ログイン後にコピー

接下来进入正题:使用元类批量抓取代理

批量处理抓取代理

from getpage import get_page
from pyquery import PyQuery as pq


# 道生一:创建抽取代理的metaclass
class ProxyMetaclass(type):
    """
        元类,在FreeProxyGetter类中加入
        __CrawlFunc__和__CrawlFuncCount__
        两个参数,分别表示爬虫函数,和爬虫函数的数量。
    """
    def __new__(cls, name, bases, attrs):
        count = 0
        attrs[&#39;__CrawlFunc__&#39;] = []
        attrs[&#39;__CrawlName__&#39;] = []
        for k, v in attrs.items():
            if &#39;crawl_&#39; in k:
                attrs[&#39;__CrawlName__&#39;].append(k)
                attrs[&#39;__CrawlFunc__&#39;].append(v)
                count += 1
        for k in attrs[&#39;__CrawlName__&#39;]:
            attrs.pop(k)
        attrs[&#39;__CrawlFuncCount__&#39;] = count
        return type.__new__(cls, name, bases, attrs)


# 一生二:创建代理获取类

class ProxyGetter(object, metaclass=ProxyMetaclass):
    def get_raw_proxies(self, site):
        proxies = []
        print(&#39;Site&#39;, site)
        for func in self.__CrawlFunc__:
            if func.__name__==site:
                this_page_proxies = func(self)
                for proxy in this_page_proxies:
                    print(&#39;Getting&#39;, proxy, &#39;from&#39;, site)
                    proxies.append(proxy)
        return proxies


    def crawl_daili66(self, page_count=4):
        start_url = &#39;http://www.66ip.cn/{}.html&#39;
        urls = [start_url.format(page) for page in range(1, page_count + 1)]
        for url in urls:
            print(&#39;Crawling&#39;, url)
            html = get_page(url)
            if html:
                doc = pq(html)
                trs = doc(&#39;.containerbox table tr:gt(0)&#39;).items()
                for tr in trs:
                    ip = tr.find(&#39;td:nth-child(1)&#39;).text()
                    port = tr.find(&#39;td:nth-child(2)&#39;).text()
                    yield &#39;:&#39;.join([ip, port])

    def crawl_proxy360(self):
        start_url = &#39;http://www.proxy360.cn/Region/China&#39;
        print(&#39;Crawling&#39;, start_url)
        html = get_page(start_url)
        if html:
            doc = pq(html)
            lines = doc(&#39;p[name="list_proxy_ip"]&#39;).items()
            for line in lines:
                ip = line.find(&#39;.tbBottomLine:nth-child(1)&#39;).text()
                port = line.find(&#39;.tbBottomLine:nth-child(2)&#39;).text()
                yield &#39;:&#39;.join([ip, port])

    def crawl_goubanjia(self):
        start_url = &#39;http://www.goubanjia.com/free/gngn/index.shtml&#39;
        html = get_page(start_url)
        if html:
            doc = pq(html)
            tds = doc(&#39;td.ip&#39;).items()
            for td in tds:
                td.find(&#39;p&#39;).remove()
                yield td.text().replace(&#39; &#39;, &#39;&#39;)


if __name__ == &#39;__main__&#39;:
    # 二生三:实例化ProxyGetter
    crawler = ProxyGetter()
    print(crawler.__CrawlName__)
    # 三生万物
    for site_label in range(crawler.__CrawlFuncCount__):
        site = crawler.__CrawlName__[site_label]
        myProxies = crawler.get_raw_proxies(site)
ログイン後にコピー

道生一:元类的__new__中,做了四件事:

  1. 将“crawl_”开头的类方法的名称推入ProxyGetter.__CrawlName__

  2. 将“crawl_”开头的类方法的本身推入ProxyGetter.__CrawlFunc_

  3. 计算符合“crawl_”开头的类方法个数

  4. 删除所有符合“crawl_”开头的类方法

怎么样?是不是和之前创建ORM的__mappings__过程极为相似?

一生二:类里面定义了使用pyquery抓取页面元素的方法

分别从三个免费代理网站抓取了页面上显示的全部代理。

如果对yield用法不熟悉,可以查看:
廖雪峰的python教程:生成器

二生三:创建实例对象crawler

三生万物:遍历每一个__CrawlFunc__

  1. 在ProxyGetter.__CrawlName__上面,获取可以抓取的的网址名。

  2. 触发类方法ProxyGetter.get_raw_proxies(site)

  3. 遍历ProxyGetter.__CrawlFunc__,如果方法名和网址名称相同的,则执行这一个方法

  4. 把每个网址获取到的代理整合成数组输出。

那么。。。怎么利用批量代理,冲击别人的网站,套取别人的密码,狂发广告水贴,定时骚扰客户? 呃!想啥呢!这些自己悟!如果悟不到,请听下回分解!

年轻的造物主,创造世界的工具已经在你手上,请你将它的威力发挥到极致!

请记住挥动工具的口诀:

  • 道生一,一生二,二生三,三生万物

  • 我是谁,我来自哪里,我要到哪里去

相关推荐:

python数据类型元组详细介绍

Python 元类实例解析_python

以上がPython メタクラスとは何ですか? Python メタクラスの概要の詳細内容です。詳細については、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言語に組み込みの合計機能はないため、自分で書く必要があります。合計は、配列を通過して要素を蓄積することで達成できます。ループバージョン:合計は、ループとアレイの長さを使用して計算されます。ポインターバージョン:ポインターを使用してアレイ要素を指し示し、効率的な合計が自己概要ポインターを通じて達成されます。アレイバージョンを動的に割り当てます:[アレイ]を動的に割り当ててメモリを自分で管理し、メモリの漏れを防ぐために割り当てられたメモリが解放されます。

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

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

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

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

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

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

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つずつアクセスして蓄積します。大量のデータ量については、並列計算を検討してください。

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

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

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

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

See all articles