首先,要强调一点,Python中所有的东西都是对象。这包括整数、字符串、函数以及类。即万物皆对象。
#class
class Animals(object):
'''这是Animals类哦'''
i = 1
def __init__(self):
self.i = 2
#print(type(Animals))
print(Animals) #<class '__main__.Animals'>
a = Animals
b = Animals()
print(a) #<class '__main__.Animals'> 这里就是将Animals类赋给了变量a
print(b) #<__main__.Animals object at 0x00000000031DA7B8> b是Animals类的对象
print(a.i) # 1 Animals类的属性i的值是1
print(b.i) # Animals类的对象b的属性i的值是2
def fun(c):
return c
print(fun(a)) #<class '__main__.Animals'> 这里是将类当做参数传递
def fun2():
class Dog(object):
pass
return Dog #返回的是一个类而不是类的对象
print(fun2())
#<class '__main__.fun2.<locals>.Dog'> 这里是在fun2方法中动态的创建了一个类Dog
print(fun2()())
#<__main__.fun2.<locals>.Dog object at 0x000000000324A2E8> 这里打印的就是Dog对象
#===========================================================
#列举对象的几种常用属性:注意无论是类还是对象都有这些。因为类也是对象。
print(Animals.__doc__) #这是Animals类哦 这里是额类型获取帮助信息,即三引号内的内容
print(Animals.__name__) #Animals #这里是类名
print(Animals.__module__) #__main__ 这里是类所在模块
print(Animals.__bases__) #(<class 'object'>,) 这里是类所继承的基类,是个tuple
print(Animals.__class__) #<class 'type'> 这里是类的类型
print(Animals.__dict__) #是一个字典,存放所有类成员信息,注意这里是没有i :2的
#{'i': 1, '__doc__': '这是Animal类哦', '__init__': <function Animals.__init__ at 0x00000000031FBEA0>, '__module__': '__main__', '__dict__': <attribute '__dict__' of 'Animals' objects>, '__weakref__': <attribute '__weakref__' of 'Animals' objects>}
print(b.__dict__) #{'i': 2} 存放所有实例成员信息
#两个对对象属性进行操作的函数:hasattr(实例,属性)返回的是布尔类型的值 getattr(实例,属性) 返回属性值
#注意类也是对象,所以同样适用
print(hasattr(b,'i')) # True
print(getattr(b,'i')) # 2
print(getattr(a,'i')) # 1
print(hasattr(a,'i')) # True
2017.11.15 20:32 更新,有待更新。。。。
==============================================
接着说:
既然类是对象,那么它是由谁创建的呢?
这里我们不得不提到元类了。
所谓元类:即创建类的类,而我们所熟悉了查看一个对象的类型的函数type其实就是这个元类。
type() 函数:如果你只有第一个参数则返回对象的类型,三个参数返回新的类型对象。我们通常熟悉的用法就是前一种。
#还是跟上面一样的例子
class Animals(object):
'''这是Animals类哦'''
i = 1
def __init__(self):
self.i = 2
a = Animals
b = Animals()
print(type('1')) # <class 'str'> 这里type返回的是‘1’所属的类型str,即str的实例
print(type(1)) # <class 'int'> 同理,这里是返回1所属的类型int即int的实例
print(type(a)) # <class 'type'> 这里可以看到类a是type类型的即type的实例
print(type(b)) # <class '__main__.Animals'> 这里可以看到实例化的Animals对象b则是main模块里的Animals类的实例,是Animals类型的
print(type(type(b))) # <class 'type'> 即任何一个对象的类型的类型都是type类型
print(a.__class__.__class__) #<class 'type'> 即任何一个对象的__class__的__class__都是type
'''
这里可能有人会问type类型是个什么类型?
其实说白了就是类类型,因为type是元类嘛,如果是2.7版本的话,这里就不是返回type了反而是class,其实意思都一样。
'''
#那么type是怎么创建类的呢?上面已经说到了,就是靠传入三个参数。
# type(类名, 父类的元组(针对继承的情况,可以为空),包含属性的字典(名称和值))
z = type('k',(Animals,),{}) #这里我们创建了一个类,名为k,继承的是类Animals,最后type返回的是类k的对象并传给变量z
print(z) # <class '__main__.k'> 为main模块里的k类的实例,属于k类型
print(z.i) # 1
z = type('k',(Animals,),{'i':3}) #这里我们创建了一个类,名为k,继承的是类Animals,然后重新赋给Animals类的i变量值为3,最后type返回的是类k的对象并传给变量z
print(z.i) # 3
#======================================================================
'''
说到这里,可能有人会不明白object和type的关系了,下面我们用代码来说明
'''
print(issubclass(type,object)) # True 这里说明type是object的子类
print(type.__bases__) # (<class 'object'>,) 看,这里更直观的看出type继承自object
print(object.__bases__) # () object是最顶端的,没有父类
print(type(type)) #<class 'type'>
print(type(object)) #<class 'type'>
2017.11.16 0:22更新。 真的困了,广东的这个季节,蚊子真多!!有待更新。。。。。====================================================
简单点说就是
type是用来标识类型的,
object是所有对象的基类,
如果没有了object,所有对象都不可以用了,如果没有了type则只是少了一个标识对象的类型的东西。
结束。2017.11.16 23:04
以上,如有不足欢迎指出。Thanks~!