python type和object

在Python当中万物皆对象,我们用class关键字定义的类本身也是一个对象,负责产生该对象的类称之为元类,元类可以简称为类的类,元类的主要目的是为了控制类的创建行为.
type是Python的一个内建元类,用来直接控制生成类,在python当中任何class定义的类其实都是type类实例化的结果。
只有继承了type类才能称之为一个元类,否则就是一个普通的自定义类,自定义元类可以控制类的产生过程,类的产生过程其实就是元类的调用过程.

在python中使用关键字class,python解释器在执行的时候就会创建一个对象。如下:

class Test(object):
	pass

这个对象的名字就是Test,而这个对象(类)拥有创建对象的能力,这就是为什么他是一个类的原因

一个类由三大组成部分,分别是

1、类名class_name

2、继承关系class_bases

3、类的名称空间class_dict

方式1:使用class关键字(python解释器转化为第二种)

方式2:通过type关键字,依次传入以上三个参数即可。

我们正常定义类是这样写的:

class Person(object):
    country = 'China'
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def tell(self):
        print('%s 的年龄是:%s'%(self.name,self.age))

我们可以通过第二种方式创建类:

country = 'China'
def __init__(self,name,age):
    self.name = name
    self.age = age

def tell(self):
    print('%s 的年龄是:%s'%(self.name,self.age))

Person = type('Person',(object,),{'country':country,
                                  '__init__':__init__,
                                  'tell':tell})

print(Person.__dict__)
person = Person('wtt',25)
print(person.__dict__)

Person类实际上就是一个类对象,于是我们将产生类的类称之为元类,默认的元类是type.

我们所说的元类都是指type这个元类,但是用户是可以自定义元类的,只要继承type就可以

class MyMetaClass(type):
    pass

country = 'China'
def __init__(self,name,age):
    self.name = name
    self.age = age

def tell(self):
    print('%s 的年龄是:%s'%(self.name,self.age))

Person = MyMetaClass('Person',(object,),{'country':country,
                                  '__init__':__init__,
                                  'tell':tell})

print(Person.__dict__)
person = Person('wtt',25)
print(person.__dict__)

我们也可以用这种日常的形式:

class MyMetaClass(type):
    pass

class Person(object,metaclass=MyMetaClass): #自定义元类,来创建类.
    country = 'China'
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def tell(self):
        print('%s 的年龄是:%s'%(self.name,self.age))

print(Person.__dict__)
person = Person('wtt',25)
print(person.__dict__)

摘要:
1.在python中要查看某一个类的父类可以使用它的__base__属性查看
2.要查看某一对象是属于哪一个类可以使用__class__属性查看
3.object是所有父子关系类的顶端也就是根类,所有数据类型的父类都是object
4.type是类型关系的顶端,所有的对象都是type的实例

1.print(type.__base__) # object是type的实例
  <class 'object'>

2.print(type.__class__)
  <class 'type'>

3.print(object.__base__)  # 此处可看到object父类为空,即没有比它位置更高的类
  None

4.print(object.__class__)
  <class 'type'>

5.class Demo:
    pass
print(Demo.__base__)
print(Demo.__class__)
  <class 'object'>
  <class 'type'>

f = Demo()
print(f.__class__)
  <class '__main__.Demo'>

由以上结果可得出:
1.object是type的实例
2.type是type的实例,type的父类是object
3.object没有父类
4.Demo的父类是object,Demo是type的实例

# 定义元类(metaclass)
class Demo(type):
    pass

print(Demo.__base__)
print(Demo.__class__)

<class 'type'>
<class 'type'>

Demo继承了type,Demo既是type的子类,又是type的实例


class TestDemo(metaclass=Demo):
    pass
print(TestDemo.__base__)
print(TestDemo.__class__)

<class 'object'>
<class '__main__.Demo'>

TestDemo是object的子类,是元类Demo的实例

总之:
1.object是一个type的实例,type继承自object
2.类最终都是type的实例化而来,因此,元类就是创建类这种对象的东西。
3.Python中的一切都是对象,它们要么是类的实例,要么是元类的实例,除了type

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

季布,

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值