Day28- метаклассом, лежащий в основе анализа класса, объект управления генерации

Слишком трудно слишком трудно, я терпеть не могу терпеть не могу

Мото 类

В передней части ядерной энергетики, это может быть мой загружен, чтобы заставить условно говоря, все назад, я хочу открыть установлен.

Во-первых, мы должны выяснить, что метаклассом.

Мы знаем, в питона, все могут быть, в самом деле, узнал юаней перед классом, я действительно не могу понять, я только знаю, что такое понятие, знает встретил юаней класса, я понял смысл этой концепции.

У нас есть класс, а затем создать объект этого класса для производства, не правда ли, что нет ни одной мысли, например, как прийти, для да, из класса, и что он не думал о том, что происходит внутри операция?

На самом деле, он также является объектом класса, он является объектом метаклассы и метаклассом экземпляр объекта, который из класса! Теперь не то понятие объекта инстанциируется ограничивается только типом вещи вне, и все подчиняется, не может чувствовать себя немного?

Тогда Метаклассы понятие ясно, класс метаклассом является экземпляром объекта класса. Так метаклассом это то, что выглядит?

print(type(dict))
print(type(list))
print(type(str))
print(type(object))

print(type(type))

< «типа» класс>
< «типа» класс>
< «типа» класс>
< «типа» класс>
<класс «типа»>

Мы можем видеть, что эти типы классов все виды типа, и даже сам тип, являются классом типа.

Таким образом, в основном определены, типа, является метаклассом. И все классы инстанцируются его, а потом из конкретизированного класса для создания экземпляра объекта.

Ну, так как метакласс класс, первый класс юани, как пришел? Во-первых, курица или яйцо? Первый метаклассом написан на языке C, я считаю, что мы все понимаем, дурачок, который встретил точно объяснить что-то, вы можете сказать, написанные на C. , , , ,

Я не думаю об этом, и он в нижней части вещей.

Основной принцип анализа класса

Мы знаем, что имя класса + класса, будет построен к классу, и тот, как мы знаем, на самом деле, мы не думали так просто, на самом деле, это мета-класс экземпляра класса создал этот объект.

На самом деле, он прошел через такой шаг.

Person=type('Person',(object,),dict)

Возвращаемое значение представляет собой тип класса, человек получает возвращаемое значение, поэтому будет называться «Person» класс, присвоенный лицо. Вы можете использовать этот человек, чтобы создавать экземпляры различных объектов.

Во-первых, мы говорим о роли каждого параметра, первый аргумент, то ясно, что имя класса, который будет создан, а второй в том, что класс наследует от родительского класса, должны быть записаны в виде или список кортежей, потому что вы не просто наследовать класс, и третий ключ, является словарь, то словарь, что написано внутри? Вы помните, что вы создаете класс раньше время, не писать много собственности, которая во многих отношениях, на этот раз эти свойства и методы, все толкнули идти внутрь этой Dict

l={}
exec('''
school='oldboy'
def __init__(self,name):
    self.name=name
def score(self):
    print('分数是100')
''',{},l)

Exec метод, в общей сложности три параметра, первый это строка, вторая глобальная переменная для хранения словаря, а третий хранится словарь локальных переменных, мы должны принять, что такие вещи внутри, так что нам нужно третий параметр, а затем в целом внутрь л, этот эффект Exec, он просто строка блока кода в первой позиции параметра, а затем выполнить код, генерирует различные пространства имен и затем есть отображение между пространством имен внутри третьего параметра л, л можно сказать, хранится внутри отношения отображения. Итак, давайте посмотрим на эту печать л.

{'school': 'oldboy', '__init__': <function __init__ at 0x0000016746FD1EA0>, 'score': <function score at 0x00000167471BD048>}

Конечно же, это словарь отображение репозитория, а затем бросил третий тип параметра в словаря

Person=type('Person',(object,),l)

Становится так, то здесь, то генерируется хороший класс, мы можем использовать класс Person, чтобы создать экземпляр объекта.

Конечно, некоторые люди имеют такую ​​проблему, почему тип квадратных трех параметров формируют класс, поставить параметр типа возврата.

IMG

Видите, он такой источник. Мы используем этот тип мета-класса экземпляра класса, он вызывает метод инициализации типа, который настолько специфичен.

Контролируется генерации класса метакласса

Мы знаем, что тип метаклассом, написал, мы не можем двигаться, то, как контролировать класс, порожденный метакласса это, мы можем писать, писать сами по себе, то другой вид по умолчанию юаней написать в свой собственный класс метаклассом достаточно.

Метакласс: контролировать генерируемый класс: Вы можете контролировать имя класса, родительский класс может наследовать контроль над именем класса управления пространством

Пользовательский класс метаданных должен наследовать тип, создать класс, который наследует тип, этот класс называется метаклассом

class Mymeta(type):
    # def __init__(self,*args,**kwargs):
    def __init__(self,name,bases,dic):
        # self 就是Person类
        # print(name)
        # print(bases)
        # print(dic)

Таким образом, мы пишем мета-класс обычая.

Сделайте небольшое упражнение

Упражнение 1: неограниченный контроль Имя класса должно начинаться с С.Б.

class Mymeta(type):
    # def __init__(self,*args,**kwargs):
    def __init__(self,name,bases,dic):
        if not name.startswith('sb'):
            raise Exception('类名没有以sb开头')

Например, мы создаем класс

 class person(metaclass=Mymeta):
        name='nick'

Мы добавили метакласса = Mymeta в скобках внутри класса, который обозначен его метакласса наш обычай, что класс, вместо типа по умолчанию. На этот раз мы называем (то есть собственное имя класса), основание (то есть его родительский класс, не существует), и ДИК (его кодовые блоки) не переходят в методе инициализации пользовательского метакласс, следующие операции вы поймете.

Упражнение два: класс должен добавить комментарий

class Mymeta(type):
    # def __init__(self,*args,**kwargs):
    def __init__(self,name,bases,dic):
        if not self.__dict__['__doc__']:
            raise Exception('类里没有注释')

Это не объяснить, по той же причине

Процесс управления класса Yuan, вызвав класс

Это и выше какая разница?

Разница в том, что именно эта деталь

Вызов класса управления технологическими процессами, в самом деле, в управлении: генерируется объект

Как добиться? С __call__ для достижения

Например, мы должны сгенерировать новый класс начинается с qssb, вы можете написать логику решения в вызове внутри.

class Mymeta(type):
    def __call__(self, *args, **kwargs):
        obj=object.__new__(self)
        obj.__init__(*args, **kwargs)
        # print(obj.__dict__)
        if not obj.__class__.__name__.startswith('qssb'):
            raise Exception('类名没有以qssb开头')
        return obj
class Person(object,metaclass=Mymeta):
    school='oldboy'
    def __init__(self,name):
        self.name=name
    def score(self):
        print('分数是100')

p=Person('nick')
print(p.name)

Я не буду объяснять этот код, я устал.

Потому что экземпляр из р, называет Person (), так что он будет выполнять свой метод __call__ метакласса, и есть вызовы в своей собственной инициализации, понять его. Сначала мы смотрим на новый, в его скобках написать имя класса, вы можете создать экземпляр пустой объект. Тогда вы понимаете,

Позаботься имущество было метаклассом

Свойство Порядок поиска класс: начать с классом сам смотрю ---> MRO наследование для родительского класса, чтобы найти ----> класса Yuan, чтобы найти свое собственное определение ---> ввести ---> ошибки

атрибутов объекта поиска заказа: начните с самого объекта, чтобы найти ---> класс найти ---> MRO наследство родительского класса, чтобы найти ---> ошибка

End End, боли в спине

рекомендация

отwww.cnblogs.com/chanyuli/p/11455247.html