笔记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。这个对象(类)自身拥有创建对象(类实例)的能力,而这就是为什么它是一个类的原因。但是,它的本质仍然是一个对象,于是我们可以对它做如下的操作:
print(ObjectCreator)
echo(ObjectCreator)
objectCreator = ObjectCreator
print(objectCreator)
返回
二。 使用type()动态创建类
因为类也是对象,所以我们可以在程序运行的时候创建类。
Python 是动态语言。
动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的。
type()
在
hello.py
模块下
然后在另一个模块中引用 hello 模块,并输出相应的信息。
其中 type()
函数的作用是可以查看一个类型和变量的类型。
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 中所有的东西,注意喔,这里是说所有的东西,他们都是对象。
这包括整数、字符串、函数以及类。它们全部都是对象,而且它们都是从一个类创建而来。
<class 'int'> <class 'str'> <class 'function'> <class 'main.eat'>
创建这些类的类是什么?
四:自定义元类
'__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