关于Python中class的理解之万物皆对象

生气首先,要强调一点,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~!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值