목차
파이썬의 가장 어려운 지식 포인트를 두 문장으로 마스터하세요 - 메타클래스
年轻的造物主,请随我一起开创新世界。
挑战一:通过元类创建ORM
道生一
一生二
二生三、三生万物
挑战二:网络代理的爬取
准备工作,先爬个页面玩玩
批量处理抓取代理
年轻的造物主,创造世界的工具已经在你手上,请你将它的威力发挥到极致!
백엔드 개발 파이썬 튜토리얼 Python 메타클래스란 무엇입니까? Python 메타클래스 소개

Python 메타클래스란 무엇입니까? Python 메타클래스 소개

Sep 12, 2018 pm 03:09 PM
python 메타클래스

이 기사에서는 Python 메타클래스가 무엇인지 설명합니다. Python 메타클래스에 대한 소개에는 특정 참고 가치가 있습니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

파이썬의 가장 어려운 지식 포인트를 두 문장으로 마스터하세요 - 메타클래스

소위 "메타클래스는 99%의 파이썬 프로그래머가 사용하지 않을 기능입니다"라는 말에 겁먹지 마세요. 왜냐하면모든 중국인은 메타클래스의 자연스러운 사용자이기 때문입니다

메타클래스를 배우려면 문장 두 개만 알면 됩니다.

  • 타오는 하나를 낳고, 하나는 둘을 낳고, 둘은 셋을 낳고, 셋은 낳습니다. to all things

  • 나는 누구일까요? 나는 어디서 왔는가? 나는 어디로 가는 걸까? (블로거는 다음과 같아야 한다고 생각합니다: 나는 누구인가? 나는 어디서 왔는가? 나는 무엇을 할 수 있는가?)

파이썬 세계에는 영원한 도가 있는데, 그것은 바로 "유형"입니다. 꼭 지켜주세요. 당신의 마음 속에서 유형은 도(Tao)입니다. 이렇게 방대한 Python 생태계는 모두 유형별로 생성됩니다.

Python 메타클래스란 무엇입니까? Python 메타클래스 소개

도는 하나를 만들고, 둘을 만들고, 둘은 셋을 만들고, 셋은 만물을 만듭니다.

  1. 는 유형

  2. One은 메타클래스(메타클래스 또는 클래스 생성기)

  3. Two는 클래스(클래스 또는 인스턴스 생성기)

  4. 인스턴스( 인스턴스)

  5. Everything은 우리가 보통 파이썬을 사용할 때 인스턴스의 다양한 속성과 메소드를 호출합니다.

Tao와 one은 오늘 우리가 논의하는 명제이고, two, three, all things는 우리가 자주 사용하는 클래스, 인스턴스, 속성 및 메서드입니다. 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()
로그인 후 복사

출력 효과:

Hello, world.
로그인 후 복사

이것은 "둘이 셋을 낳고, 셋이 만물을 낳는다"라는 표준적인 과정입니다. 클래스부터 호출할 수 있는 메서드까지 이 두 단계가 사용됩니다.

그렇다면 우리는 수업이 어디서 오는지 묻지 않을 수 없습니다. 코드의 첫 번째 줄로 돌아갑니다.

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. ----调用结果完全一样。
로그인 후 복사

가장 흥미로웠던 부분을 되돌아보겠습니다.

Tao가 직접 두 개를 낳았습니다.:

Hello = type('Hello', (object,), dict(say_hello=fn))
로그인 후 복사

이것이 Python 세계의 기원인 "Tao"입니다. , 당신은 이것을 할 수 있고 놀랍습니다.

세 가지 매개변수에 주목하세요! 이는 인류의 세 가지 영원한 명제, 즉 나는 누구이며, 어디서 왔고, 어디로 가고 싶은가와 일치합니다.

  • 첫 번째 매개변수: 나는 누구인가. 여기에는 다른 것과는 다른 이름이 필요합니다. 위의 예에서는 "Hello"

  • 두 번째 매개변수: Where do I from from

    를 지정합니다. 여기서는 이것이 내 "부모 클래스"인지 알아야 합니다. 위의 예에서 내 부모 클래스는 "객체"입니다. 이는 Python의 매우 하위 클래스입니다.

  • 세 번째 매개변수: 어디로 가고 싶어요

    여기에는 사전으로 호출하여 매개변수로 전달해야 하는 메서드와 속성이 포함되어 있습니다. 위의 예에서는 사전에 싸인 say_hello 메소드가 있습니다.

세 가지 영원한 명제는 모든 클래스, 모든 인스턴스, 심지어 모든 인스턴스 속성과 메소드에 의해 소유된다는 점에 주목할 가치가 있습니다. "작성자"인 Tao와 Yi, 즉 유형과 메타클래스도 이 세 가지 매개변수를 갖고 있는 것은 당연합니다. 그런데 보통 클래스의 세 가지 영원한 명제는 매개변수로 전달되지 않고 다음과 같은 방식으로 전달됩니다

class Hello(object){
# class 后声明“我是谁”
# 小括号内声明“我来自哪里”
# 中括号内声明“我要到哪里去”
    def say_hello(){
        
    }
}
로그인 후 복사

  • Creator가 직접 한 사람을 생성할 수도 있지만 이게 힘든 작업입니다. 창조주는 먼저 "인간"이라는 종을 창조한 다음 일괄적으로 특정 개인을 창조할 것입니다. 그리고 세 가지 영원한 제안을 전달하십시오.

  • "타오"는 "2"를 직접 생산할 수 있지만 먼저 "1"을 생산한 다음 "2"를 일괄 생산합니다.

  • type은 클래스(클래스)를 직접 생성할 수도 있지만 먼저 메타클래스(메타클래스)를 생성한 다음 메타클래스를 사용하여 클래스(클래스)를 일괄 맞춤화할 수도 있습니다.

메타클래스 - 타오는 하나를 낳고 인생은 둘을 낳는다

일반적으로 메타클래스는 접미사 Metalass를 붙여 명명됩니다. 자동으로 hello라고 말할 수 있는 메타클래스가 필요하다고 상상해 보세요. 때로는 say_Hello가 필요하고, 때로는 say_Hi가 필요하고, 때로는 say_Sayolala가 필요하고, 때로는 say_Nihao가 필요합니다.

내장된 각 say_xxx를 클래스에서 한 번씩 선언해야 한다면 얼마나 힘든 일이겠습니까! 문제를 해결하려면

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)
로그인 후 복사

두 가지 점을 기억하세요.

1. 메타클래스는 "유형"에서 파생되므로 상위 클래스에 유형을 전달해야 합니다. 【
타오는 하나를 만들기 때문에 하나는 도를 담고 있어야 한다

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 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 Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

PS가 계속 로딩을 보여주는 이유는 무엇입니까? PS가 계속 로딩을 보여주는 이유는 무엇입니까? Apr 06, 2025 pm 06:39 PM

PS "로드"문제는 자원 액세스 또는 처리 문제로 인한 것입니다. 하드 디스크 판독 속도는 느리거나 나쁘다 : CrystalDiskinfo를 사용하여 하드 디스크 건강을 확인하고 문제가있는 하드 디스크를 교체하십시오. 불충분 한 메모리 : 고해상도 이미지 및 복잡한 레이어 처리에 대한 PS의 요구를 충족시키기 위해 메모리 업그레이드 메모리. 그래픽 카드 드라이버는 구식 또는 손상됩니다. 운전자를 업데이트하여 PS와 그래픽 카드 간의 통신을 최적화하십시오. 파일 경로는 너무 길거나 파일 이름에는 특수 문자가 있습니다. 짧은 경로를 사용하고 특수 문자를 피하십시오. PS 자체 문제 : PS 설치 프로그램을 다시 설치하거나 수리하십시오.

PS가 시작될 때 로딩 문제를 해결하는 방법은 무엇입니까? PS가 시작될 때 로딩 문제를 해결하는 방법은 무엇입니까? Apr 06, 2025 pm 06:36 PM

부팅 할 때 "로드"에 PS가 붙어있는 여러 가지 이유로 인해 발생할 수 있습니다. 손상되거나 충돌하는 플러그인을 비활성화합니다. 손상된 구성 파일을 삭제하거나 바꾸십시오. 불충분 한 메모리를 피하기 위해 불필요한 프로그램을 닫거나 메모리를 업그레이드하십시오. 하드 드라이브 독서 속도를 높이기 위해 솔리드 스테이트 드라이브로 업그레이드하십시오. 손상된 시스템 파일 또는 설치 패키지 문제를 복구하기 위해 PS를 다시 설치합니다. 시작 오류 로그 분석의 시작 과정에서 오류 정보를 봅니다.

PS의 로딩 속도 속도를 높이는 방법? PS의 로딩 속도 속도를 높이는 방법? Apr 06, 2025 pm 06:27 PM

느린 Photoshop 스타트 업 문제를 해결하려면 다음을 포함한 다중 프론트 접근 방식이 필요합니다. 하드웨어 업그레이드 (메모리, 솔리드 스테이트 드라이브, CPU); 구식 또는 양립 할 수없는 플러그인 제거; 정기적으로 시스템 쓰레기 및 과도한 배경 프로그램 청소; 주의를 기울여 관련없는 프로그램 폐쇄; 시작하는 동안 많은 파일을 열지 않도록합니다.

느린 PS로드가 컴퓨터 구성과 관련이 있습니까? 느린 PS로드가 컴퓨터 구성과 관련이 있습니까? Apr 06, 2025 pm 06:24 PM

PS 로딩이 느린 이유는 하드웨어 (CPU, 메모리, 하드 디스크, 그래픽 카드) 및 소프트웨어 (시스템, 백그라운드 프로그램)의 결합 된 영향 때문입니다. 솔루션에는 하드웨어 업그레이드 (특히 솔리드 스테이트 드라이브 교체), 소프트웨어 최적화 (시스템 쓰레기 청소, 드라이버 업데이트, PS 설정 확인) 및 PS 파일 처리가 포함됩니다. 정기적 인 컴퓨터 유지 보수는 또한 PS 달리기 속도를 향상시키는 데 도움이 될 수 있습니다.

PS가 파일을 열 때로드 문제를 해결하는 방법은 무엇입니까? PS가 파일을 열 때로드 문제를 해결하는 방법은 무엇입니까? Apr 06, 2025 pm 06:33 PM

"로드"는 PS에서 파일을 열 때 말더듬이 발생합니다. 그 이유에는 너무 크거나 손상된 파일, 메모리 불충분, 하드 디스크 속도가 느리게, 그래픽 카드 드라이버 문제, PS 버전 또는 플러그인 충돌이 포함될 수 있습니다. 솔루션은 다음과 같습니다. 파일 크기 및 무결성 확인, 메모리 증가, 하드 디스크 업그레이드, 그래픽 카드 드라이버 업데이트, 의심스러운 플러그인 제거 또는 비활성화 및 PS를 다시 설치하십시오. 이 문제는 PS 성능 설정을 점차적으로 확인하고 잘 활용하고 우수한 파일 관리 습관을 개발함으로써 효과적으로 해결할 수 있습니다.

PS가 항상 로딩되고 있음을 보여줄 때 로딩 문제를 해결하는 방법은 무엇입니까? PS가 항상 로딩되고 있음을 보여줄 때 로딩 문제를 해결하는 방법은 무엇입니까? Apr 06, 2025 pm 06:30 PM

PS 카드가 "로드"되어 있습니까? 솔루션에는 컴퓨터 구성 (메모리, 하드 디스크, 프로세서) 확인, 하드 디스크 조각 청소, 그래픽 카드 드라이버 업데이트, PS 설정 조정, PS 재설치 및 우수한 프로그래밍 습관 개발이 포함됩니다.

PS 페더 링은 어떻게 전환의 부드러움을 제어합니까? PS 페더 링은 어떻게 전환의 부드러움을 제어합니까? Apr 06, 2025 pm 07:33 PM

깃털 통제의 열쇠는 점진적인 성격을 이해하는 것입니다. PS 자체는 그라디언트 곡선을 직접 제어하는 ​​옵션을 제공하지 않지만 여러 깃털, 일치하는 마스크 및 미세 선택으로 반경 및 구배 소프트를 유연하게 조정하여 자연스럽게 전이 효과를 달성 할 수 있습니다.

설치 후 MySQL을 사용하는 방법 설치 후 MySQL을 사용하는 방법 Apr 08, 2025 am 11:48 AM

이 기사는 MySQL 데이터베이스의 작동을 소개합니다. 먼저 MySQLworkBench 또는 명령 줄 클라이언트와 같은 MySQL 클라이언트를 설치해야합니다. 1. MySQL-Uroot-P 명령을 사용하여 서버에 연결하고 루트 계정 암호로 로그인하십시오. 2. CreateABase를 사용하여 데이터베이스를 작성하고 데이터베이스를 선택하십시오. 3. CreateTable을 사용하여 테이블을 만들고 필드 및 데이터 유형을 정의하십시오. 4. InsertInto를 사용하여 데이터를 삽입하고 데이터를 쿼리하고 업데이트를 통해 데이터를 업데이트하고 DELETE를 통해 데이터를 삭제하십시오. 이러한 단계를 마스터하고 일반적인 문제를 처리하는 법을 배우고 데이터베이스 성능을 최적화하면 MySQL을 효율적으로 사용할 수 있습니다.

See all articles