博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
day6面向对象--类的特殊成员方法
阅读量:6542 次
发布时间:2019-06-24

本文共 3335 字,大约阅读时间需要 11 分钟。

类的特殊成员方法

    1. __doc__  表示类的描述信息

class Func(object):    '''__doc__方法是用来打印类的描述信息'''    def tell(self):        pass    def enroll(self):        passprint(Func.__doc__)    # 输出:类的描述信息 运行结果如下: __doc__方法是用来打印类的描述信息

    __doc__是用来打印类的描述信息。就是类的注释。

    2.__module__和__class__

    __module__表示当前操作的对象在那个模块

    __class__ 表示当前操作的对象的类是什么

 

    3. __init__ 构造方法,通过类创建对象时,自动触发执行。

    4.__del__

 

    析构方法,当对象在内存中被释放时,自动触发执行。

    注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的

     5. __call__ 对象后面加括号,触发执行。

    注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

class Func(object):    def __init__(self,name,age,sex):        self.name = name        self.age = age        self.sex = sex    def enroll(self):        print("%s in enrolling in the school" %self.name)    # def __call__(self):    #     print("实例化加夸好还可以执行,窝草")f = Func("alex",18,"Female")f.enroll()f() 运行结果如下: alex in enrolling in the school Traceback (most recent call last):   File "/home/zhuzhu/第七天/class的方法.py", line 17, in 
    f() TypeError: 'Func' object is not callable

 

    上面代码中,f是一个实例,我们知道,实例化的变量是不能够加上括号执行的。提示错误:TypeError: 'Func' object is not callable,说不能够callable,现在我们加上__call__()方法,如下:

class Func(object):    def __init__(self,name,age,sex):        self.name = name        self.age = age        self.sex = sex    def enroll(self):        print("%s in enrolling in the school" %self.name)    def __call__(self):        print("实例化加夸好还可以执行,窝草")f = Func("alex",18,"Female")f.enroll()f() 运行结果如下: alex in enrolling in the school 实例化加夸好还可以执行,窝草

 

    从上面代码可以看出,本来实例加上括号不能执行的,现在可以执行了,就因为__call__()方法,可以看出,__call__()方法,对实例就行了构造,让其能够执行__call__()的方法。

    6. __dict__ 查看类或对象中的所有成员

class Province:    country = 'China'    def __init__(self, name, count):        self.name = name        self.count = count    def func(self, *args, **kwargs):        print('func')# 获取类的成员,即:静态字段、方法、print(Province.__dict__)# 输出:{
'country': 'China', '__module__': '__main__', 'func':
, '__init__':
, '__doc__': None}obj1 = Province('HeBei', 10000)print(obj1.__dict__)# 获取 对象obj1 的成员# 输出:{
'count': 10000, 'name': 'HeBei'}obj2 = Province('HeNan', 3888)print(obj2.__dict__)# 获取 对象obj1 的成员# 输出:{
'count': 3888, 'name': 'HeNan'}

    7.__str__ 如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。

class Foo:    def __str__(self):        return 'alex li'obj = Foo()print(obj)# 输出:alex li

 

    8.__getitem__、__setitem__、__delitem__

    用于索引操作,如字典。以上分别表示获取、设置、删除数据

class Foo(object):    def __getitem__(self, key):        print('__getitem__', key)    def __setitem__(self, key, value):        print('__setitem__', key, value)    def __delitem__(self, key):        print('__delitem__', key)obj = Foo()result = obj['k1']  # 自动触发执行 __getitem__obj['k2'] = 'alex'  # 自动触发执行 __setitem__del obj['k1']

 

    9. __new__ \ __metaclass__

class Foo(object):    def __init__(self, name):        self.name = namef = Foo("alex")

 

   上述代码中,f 是通过 Foo 类实例化的对象,其实,不仅 f 是一个对象,Foo类本身也是一个对象,因为在Python中一切事物都是对象

    如果按照一切事物都是对象的理论:obj对象是通过执行Foo类的构造方法创建,那么Foo类对象应该也是通过执行某个类的 构造方法 创建。

    <class '__main__.Foo'>    # 输出:<class '__main__.Foo'>     表示,obj 对象由Foo类创建

  <class 'type'>      # 输出:<type 'type'>              表示,Foo类对象由 type 类创建

    所以,f对象是Foo类的一个实例Foo类对象是 type 类的一个实例,即:Foo类对象 是通过type类的构造方法创建。   

    http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python

转载于:https://www.cnblogs.com/gengcx/p/7257912.html

你可能感兴趣的文章
ofstream 的中文目录问题
查看>>
Android存储方式之SQLite的使用
查看>>
洛谷P1287 盒子与球 数学
查看>>
Bootstrap vs Foundation如何选择靠谱前端框架
查看>>
与、或、异或、取反、左移和右移
查看>>
vue常用的指令
查看>>
matlab练习程序(随机游走图像)
查看>>
Linux命令行下运行java.class文件
查看>>
input文本框实现宽度自适应代码实例
查看>>
protocol buffers的编码原理
查看>>
行为型设计模式之命令模式(Command)
查看>>
减少死锁的几个常用方法
查看>>
HDFS 核心原理
查看>>
正确配置jstl的maven依赖,jar包冲突的问题终于解决啦
查看>>
利用KMP算法解决串的模式匹配问题(c++) -- 数据结构
查看>>
登录内网账号后,连接不上内网网址
查看>>
安装 MariaDB
查看>>
【deep learning学习笔记】注释yusugomori的DA代码 --- dA.h
查看>>
纯手工打造漂亮的垂直时间轴,使用最简单的HTML+CSS+JQUERY完成100个版本更新记录的华丽转身!...
查看>>
java 为啥变量名前要加个m?
查看>>