类、对象、父类、元类

python中一切皆对象

1. 名词解释

  1. 类: 类是一个抽象的概念,是一系列对象中相似特征与技能的结合体,不存在某一个对应的实体
  2. 对象:是类实例化的结果, 是一个实际存在的事物,通过对象可以找到一个固定的个体
  3. 父类: 类存在继承的特性, 类可以继承父类, 并继承其中的方法与属性, python3中都是新式类,不写明时都是继承自 object基类
  4. 元类: python中一切皆对象, 类本身也是对象, 元类就是用来生成类的类

2. 名称空间的访问顺序

前提:我们平时调用方法与属性时, 通常是通过 类生成的对象 来调用的

  1. 普通对象的名称空间 -> 类的名称空间 -> 根据mro列表查找父类的名称空间

上方需要说明的是:

  • 我们平时会根据类生成对象, 然后通过对象来调用方法与属性
  • 此时我们首先会访问对象的名称空间, 然后访问类的名称空间, 然后访问父类的名称空间
  • 此过程并不会访问元类的名称空间, 因为对象只能向上访问到类及父类的名称空间

然而

  • 我们会想,不是会访问类的名称空间嘛? 元类也是类, 为什么不会访问到呢?
  • 那是因为: 元类是类的类, 而不是对象的类, 只有我们通过 【类.方法】 访问方法时, 才会先访问类自己的名称空间, 然后再访问元类的名称空间, 因为元类 是 类的类

3. __init__, __new__, __call__

前提: 类实例化对象时分为两步:1. 通过类的__new__方法生成一个空的对象 2. 通过类的__init__方法来初始化对象

  1. __init__: 是用来对象初始化的, 通过__init__中的方法,可以初始化对象中独特的属性, 生成对象自己的名称空间
  2. __new__: 是用来生成空的对象的, 我们听其他语言说的new一个新对象可以辅助我们理解
1. 在生成对象时, 首先会调用 类的 __new__方法, 生成一个空的对象
class TestClass:   ## 基础的单例模式
    obj = None
    def __new__(cls, *args. **kwargs):
        if cls.obj:
            return cls.obj
        else:
            cls.obj = super().__new__(cls, *args, **kwargs)
            return cls.obj
a = TestClass()
b = TestClass()
print(a)  ## <__main__.TestClass object at 0x000001F2BC04ACD0>
print(b)  ## <__main__.TestClass object at 0x000001F2BC04ACD0>
2. 然后调用对象的 __init__方法, 进行对象的初始化
  1. __call__ : 此方法用来表示对象是否可执行, 对象会调用类的__call__ 方法, 如果类存在此方法, 就可以调用, 不存在就不可以调用, 决定类是否可以被调用的方法是元类的__call__方法
class TestClass:
    def __init__(self, name):
        self.name = name 
    def __call__(self):
        return self.name
lee = TestClass('lee')  # 不会打印
andy = TestClass('andy')  # 不会打印
lee()  # lee
andy()  # andy

4. 自定义元类

我们如果想要控制类的生成, 可以自定义元类

class MetaClass(type):   # 继承自元类
    def __init__(cls, class_name, bases, dict):  # 此处无法修改dict内的值
        cls.name = 'andy'  # 此方式可以为类增加属性
        if not class_name.istitle():
            super().__init__(class_name, bases, dict)
        else:
            raise valueError('class name is not valid')
    def __new__(cls, class_name, bases, dict):
        dict['__author__'] = 'lee'  # 为类增加属性
        return super().__new__(cls, class_name, bases, dict)
其中:
 - class_name, bases, dict 是三个固定不必须要传入的参数
 - class_name: 类的名字
 - bases: 类的父类们
 - dict: 类的名称空间 


class FromMetaClass(metaclass=MetaClass):
    def __init__(self):
        pass
print(FromMetaClass.__dict__)  
# {'__module__': '__main__',
# '__init__': <function FromMetaClass.__init__ at 0x0000029F8C9083A0>,
# '__author__': 'lee',
# '__dict__': <attribute '__dict__' of 'FromMetaClass' objects>, 
#'__weakref__': <attribute '__weakref__' of 'FromMetaClass' objects>, 
#'__doc__': None, 
#'name': 'andy'}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容