• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
66zhyh99
博客园    首页    新随笔    联系   管理    订阅  订阅

笔记2:python 类

python 类:

一。类就是一组用来描述如何生成一个对象的代码段

在 Python 中,可以把类理解成也是一种对象。

python中类的三个特性:

1.身份:每个对象都有一个唯一的身份标识自己,任何对象的身份都可以使用内建函数 id() 来得到,可以简单的认为这个值是该对象的内存地址。

2.类型:对象的类型决定了对象可以保存什么类型的值,有哪些属性和方法,可以进行哪些操作,遵循怎样的规则。可以使用内建函数 type() 来查看对象的类型。

3.值:对象所表示的数据

因为只要使用关键字 class ,Python 解释器在执行的时候就会创建一个对象。

class ObjectCreator(object):
   pass
mObject = ObjectCreator()
print(mObject)
输出:
<__main__.ObjectCreator object at 0X000000000023ee048>

如:

class ObjectCreator(object):
pass

当程序运行这段代码的时候,就会在内存中创建一个对象,名字就是ObjectCreator。这个对象(类)自身拥有创建对象(类实例)的能力,而这就是为什么它是一个类的原因。但是,它的本质仍然是一个对象,于是我们可以对它做如下的操作:

​

ce75ca1aeebac097523ce042cbb1efb0.png

print(ObjectCreator)

echo(ObjectCreator)

objectCreator = ObjectCreator

print(objectCreator)

返回

c4b845cf5b83768ee432af7a5dba68d4.png

二。 使用type()动态创建类

因为类也是对象,所以我们可以在程序运行的时候创建类。

Python 是动态语言。

动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的。

type()

在 hello.py模块下

 

eb1516a8fc8d16d333632a87c865af27.png

然后在另一个模块中引用 hello 模块,并输出相应的信息。

其中 type() 函数的作用是可以查看一个类型和变量的类型。

1ae1c83a0d2c4558fe8107d3d7e55b5a.png

Hello 是一个 class ,它的类型就是 type ,而 h 是一个实例,它的类型就是 com.twowater.hello.Hello。

其实 type() 函数不仅可以返回一个对象的类型,也可以创建出新的类型。

class 的定义是运行时动态创建的,而创建 class 的方法就是使用 type() 函数。

type(即将新建的类名, 父类的元组(针对继承的情况,可以为空),包含属性的字典(名称和值))

def printHello(self,name='py'):
   print('hello,', name)
#创建Hello类
Hello =type('Hello',(object,),dict(hello=printHello))
#实例化Hello类
h=Hello()
#调用方法
h.hello()
print(type(Hello))
print(type(h))

返回

hello, py
<class 'type'>
<class '__main__.Hello'>

三。元类

元类就是用来创建类的。也可以换个理解方式就是:元类就是类的类。

实际上 type() *函数是一个元类。type() 就是 Python 在背后用来创建所有类的元类。*

为什么 type() 函数是 type 而不是 Type呢?

这可能是为了和 str 保持一致性,str 是用来创建字符串对象的类,而 int 是用来创建整数对象的类。

type 就是创建类对象的类。

Python 中所有的东西,注意喔,这里是说所有的东西,他们都是对象。

这包括整数、字符串、函数以及类。它们全部都是对象,而且它们都是从一个类创建而来。

6c00191dd088e96acf403335487bf8ba.png

<class 'int'> <class 'str'> <class 'function'> <class 'main.eat'>

创建这些类的类是什么?

40a6c0d510e81a55191241ea7d5e04f4.png

四:自定义元类

'__metaclass__'

metaclass:当我们定义了类以后,就可以根据这个类创建出实例,所以:先定义类,然后创建实例。

先定义metaclass,然后创建类,最后搞实例。

class MyObject(object):
__metaclass__ = something…
[…]

如果是这样写的话,Python 就会用元类来创建类 MyObject。

当你写下 class MyObject(object),但是类对象 MyObject 还没有在内存中创建。Python 会在类的定义中寻找 metaclass 属性,如果找到了,Python 就会用它来创建类 MyObject,如果没有找到,就会用内建的 type 函数来创建这个类。 元类的主要目的就是为了当创建类时能够自动地改变类。

# 返回一个类,将属性都换成大写形式
def upper_attr(future_class_name, future_class_parents, future_class_attr):
   attrs = ((name, value) for name, value in future_class_attr.items() if not name.startswith('__'))
   uppercase_attr = dict((name.upper(), value) for name, value in attrs)
   return type(future_class_name, future_class_parents, uppercase_attr)
​
​
class Foo(object, metaclass=upper_attr):
   bar = 'bisheep'
​
​
print(hasattr(Foo, 'bar'))
print(hasattr(Foo, 'BAR'))
f = Foo()
print(f.BAR)

return

False
True
bisheep

 

posted @ 2022-03-09 17:45  66zhyh99  阅读(39)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3