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

本文深入探讨Python中对象的概念,解释万物皆对象的原则,并详细分析类与对象的属性、元类的工作原理及type和object的关系。
部署运行你感兴趣的模型镜像

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

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

Python面向对象编程是一种重要的编程范式,可从概念、核心要素和特征等方面理解。 宽泛来讲,面向过程编程重点关注做事情的每一个细节和过程;而面向对象编程是用对象去做事情,不关心细节和过程,秉持“万物对象”的理念。在Python里,类是描述一类事物的抽象概念,像人、动物、水果等;对象则是类的具象化,例如张三、猫、苹果等[^2]。 Python程序开发中,设计一个类有三要素:类名,即这类事物的名字,需满足大驼峰命名法;属性,是这类事物具有的特征;方法,是这类事物具有的行为。以下是创建简单类的基本语法: ```python class 类名: def 方法1(self, 参数列表): pass def 方法2(self, 参数列表): pass 对象变量 = 类名() ``` 例如定义一个`Person`类: ```python class Person: def __init__(self, name, age, gender): self.name = name self.age = age self.gender = gender def eat(self): print("吃饭") def sleep(self): print("睡觉") def work(self): print("在工作") ``` 这里`__init__`方法用于初始化对象的属性,创建对象时会自动调用。创建对象后,就可以使用对象的属性和方法,如`person = Person("张三", 20, "男")`,然后`person.eat()`就会输出“吃饭” [^3][^4]。 Python面向对象编程有三大特征。封装是将属性和方法封装到一个抽象的类中,这是面向对象编程的第一步;继承指子类可以拥有父类的属性和方法,能减少代码书写,提高代码阅读性;多态是指一个对象的多种形态,呈现“一父多子”的情况 [^2]。 面向对象编程通过类和对象将数据和方法进行封装,可提高代码的可重用性和可维护性。借助继承和多态,能实现代码的复用和扩展,编写出更灵活、高效的程序,在实际应用中,它为代码组织和管理提供了有效方式 [^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值