1.魔法属性

·  1.1__doc__魔法属性  表示类的描述信息

class Fo:
""" 这是今天第一个魔术属性__doc__"""
def func(self):
pass print(Fo.__doc__)

  运行结果

这是今天第一个魔术属性__doc__

  1.2.__moudle__魔法属性  表示当前操作的对象在那个模块

dome1.py

# -*- coding:utf-8 -*-

class Person(object):
def __init__(self):
self.name =' __moudle__'

  

dom2.py

from dome1 import Person

obj = Person()
print(obj.__module__)

  运行结果

dome1

  1.3 __class__魔法属性   表示当前操作的对象的类是什么

dome1.py

# -*- coding:utf-8 -*-

class Person(object):
def __init__(self):
self.name =' __moudle__'

  

dom2.py

from dome1 import Person

obj = Person()
print(obj.__class__)

  运行结果

Person

2.魔法方法

  2.1 __init__ () 魔法方法   初始化类属性方法,通过类创建对象时,自动触发执行

class Person:
def __init__(self, name):
self.name = name
self.age = 18 obj = Person('python')
obj.name

  运行结果

python

  2.2 __del__() 魔法方法  当对象在内存中被释放时,自动触发执行

class Dome:
def __del__(self):
print('类已经被删除')
obj = Dome()

  运行结果

类已经被删除

  2.3 __str__ () 魔法方法   打印 对象 时,默认输出该方法的返回值

class Dome:
def __str__(self):
return 'python'
obj = Dome()
print(obj)

  运行结果

python

  2.4 __dict__() 魔法方法  类或对象中的所有属性

class Province(object):
country = 'China' def __init__(self, name, count):
self.name = name
self.count = count def func(self, *args, **kwargs):
print('func') # 获取类的属性,即:类属性、方法、
print(Province.__dict__) obj1 = Province('山东', 10000)
print(obj1.__dict__) obj2 = Province('山西', 20000)
print(obj2.__dict__)

  运行结果

{'__dict__': <attribute '__dict__' of 'Province' objects>, '__module__': '__main__', 'country': 'China', '__doc__': None, '__weakref__': <attribute '__weakref__' of 'Province' objects>, 'func': <function Province.func at 0x101897950>, '__init__': <function Province.__init__ at 0x1018978c8>}

{'count': 10000, 'name': '山东'}

{'count': 20000, 'name': '山西'}

  2.6 __getitem__(),__setitem__(),__delitem__()魔法方法 用于索引操作,如字典。以上分别表示获取、设置、删除数据

# -*- coding:utf-8 -*-

class Dome(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 = Dome() result = obj['R1'] # 自动触发执行 __getitem__
obj['R2'] = 'laotie' # 自动触发执行 __setitem__
del obj['R1'] # 自动触发执行 __delitem__

  运行结果

__getitem__ R1
__setitem__ R2 python
__delitem__ R1

  由于这三个方法单独使用没作用,所以通常配合使用来实现某种功能

  2.7 __iter__()魔法方法 让一个对象变得可以迭代

  由于前面迭代器已经进行了详细的说明,如果有疑问的朋友可以翻下我关于迭代器的博客

  2.8 __next__()魔法方法 定义一个迭代器,让其能够通过next(迭代对象的迭代器)对一个可迭代对象进行迭代

  由于前面迭代器已经进行了详细的说明,如果有疑问的朋友可以翻下我关于迭代器的博客

  2.9 __name__()魔法方法 

  这个魔法方法,并不作用于类(这里我把它归为魔法方法可能不够严谨),当前程序的名称

# -*- coding:utf-8 -*-

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)
if __name__ == '__main__': obj = Foo() result = obj['R1'] # 自动触发执行 __getitem__
obj['R2'] = 'python' # 自动触发执行 __setitem__
del obj['R1'] # 自动触发执行 __delitem__

  运行结果

__getitem__ R1
__setitem__ R2 python
__delitem__ R1

  注意,该方法所在的.py文件如果作为一个工具包引入时,它里面包括的代码不会被引入,通常作为开发人员的调试空间(为所欲为也不会被外界发现)

  2.10 __enter__(),__exit__() 魔法方法,上下文管理器时使用

  __enter__() 进入‘上文操作’,__exit__()进入下文操作

  

class File():

    def __init__(self, filename, mode):
self.filename = filename
self.mode = mode def __enter__(self):
print("进入了上文操作!")
self.f = open(self.filename, self.mode)
return self.f def __exit__(self, *args):
print("进入了下文操作!")
self.f.close()

  当调用该类打开一个文件时,会自动调用__enter__()方法打开文件,但文件调用完成后会自动给调用__exit__()方法关闭文件,以免造成内存的浪费,顺便说下:with open() 方法的原理和这个自定义上下文管理器是一样的

由于前面的博客有些魔法方法已经做了解析,所以这次就没有进行详细的说明,所以可能有些魔法属性和魔法方法没有总结上去,欢迎大家补充

  

python中的魔术属性与魔法方法的更多相关文章

  1. 面向对象相关概念与在python中的面向对象知识(魔法方法+反射+元类+鸭子类型)

    面向对象知识 封装 封装的原理是,其成员变量代表对象的属性,方法代表这个对象的动作真正的封装是,经过深入的思考,做出良好的抽象(设计属性时用到),给出“完整且最小”的接口,并使得内部细节可以对外透明( ...

  2. python中几个常见的魔法方法

    首先,什么是魔法方法呢?在python中方法名如果是__xxxx__()的,那么就有特殊的功能,因此叫做"魔法"方法. __ init__()方法 当一个实例被创建的时候调用的初始 ...

  3. Python中变量的属性以及判断方法

    1.变量的属性 在Python中,创建一个变量会给这个变量分配三种属性: id ,代表该变量在内存中的地址: type,代表该变量的类型: value,该变量的值: x = 10 print(id(x ...

  4. Python笔记(二十六)_魔法方法_属性的魔法方法

    属性的魔法方法 __getattribute__(self,name):当该类的属性被访问时,自动触发,是最先被触发的属性方法 __setattr__(self,name,value):当一个属性被设 ...

  5. Python中的私有属性私有方法、类属性类方法以及单例设计模式

    私有属性是对象不希望公开的属性,私有方法是对象不希望公开的方法.在定义私有属性和私有方法时,在属性或者方法前,加上__(两个下划线) 公有方法可以通过对象名直接调用,私有方法不能通过对象名直接调用,只 ...

  6. Python学习笔记(七)——魔法方法

    1.构造和析造 魔法方法就是被双下划线包围的方法 __init__()方法 __init__方法默认没有参数,返回值为none.类实例化对象需有明确的初始化步骤要重写函数 >>> c ...

  7. Python中的str与unicode处理方法

    Python中的str与unicode处理方法 2015/03/25 · 基础知识 · 3 评论· Python 分享到:42 原文出处: liuaiqi627 的博客    python2.x中处理 ...

  8. python中的实例属性和类属性

    在python中,类属性和实例属性的区别是什么? 我认为是作用域的不同,实例对象可以访问类属性,类对象不可以访问实例属性.(类的概念本身就是作用域的概念,你不能让一只猫会飞,猫属于猫类,这一类都不会飞 ...

  9. C++:调整基类成员在派生类中的访问属性的其他方法(同名成员和访问声明)

    4.3 调整基类成员在派生类中的访问属性的其他方法 4.3.1 同名函数 在定义派生类的时候,C++语言允许在派生类中说明的成员与基类中的成员名字相同,也就是 说,派生类可以重新说明与基类成员同名的成 ...

随机推荐

  1. div display 常用属性

    none:元素不被显示. block:元素将显示为块级元素,此元素前后会带有换行符. inline:行内元素(即一个挨着一个,都在同一行按从左至右的顺序显示,不单独占一行). 参考: http://w ...

  2. KNN-学习笔记

    仅供学习使用 练习1 # coding:utf-8 # 2019/10/16 16:49 # huihui # ref: import numpy as np from sklearn import ...

  3. Set和Map集合的比较

     HashSet:数据进行hashCode比较,然后进行equals方法比较,根据比较结果进行排序.如果要对对象进行排序,对象类要重写hashCode和equals方法.TreeSet:如果要对对象进 ...

  4. Linux centosVMware Tomcat介绍、安装jdk、安装Tomcat

    一.Tomcat介绍 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache.Sun和其他一些公司及个人共同开 ...

  5. 使用 C++ 处理 JSON 数据交换格式

    一.摘要 JSON 的全称为:JavaScript Object Notation,顾名思义,JSON 是用于标记 Javascript 对象的,JSON 官方的解释为:JSON 是一种轻量级的数据传 ...

  6. h5 穿透滚动

    引子 h5 页面有弹窗浮层时,浮层之下若产生了滚动,滑动浮层时会让其产生滚动.这是示例页面,移动端访问如下: Origin My GitHub 原因 找到的信息里面有两种说法: 使用了 -webkit ...

  7. Batch批量替换hosts

    hosts文件替换 工作需要,要修改很多计算机的hosts文件,采用bat批量完成 解决的问题: 1.pc工作在非管理员权限,右键管理员权限太麻烦,因此采用执行中申请管理员权限的方式 2.hosts和 ...

  8. Oracle如何修改密码?如何解锁scott用户?

    修改密码: scott用户的密码不对,进入管理员用户,修改scott用户密码即可 或者这样修改密码:在运行栏里面敲:sqlplus(空格)/nolog 回车接着在弹出框里面敲:conn sys/pas ...

  9. Ubuntu16.04深度学习基本环境搭建,tensorflow , keras , pytorch , cuda

    Ubuntu16.04深度学习基本环境搭建,tensorflow , keras , pytorch , cuda Ubuntu16.04安装 参考https://blog.csdn.net/flyy ...

  10. 新闻网大数据实时分析可视化系统项目——7、Kafka分布式集群部署

    Kafka是由LinkedIn开发的一个分布式的消息系统,使用Scala编写,它以可水平扩展和高吞吐率而被广泛使用.目前越来越多的开源分布式处理系统如Cloudera.Apache Storm.Spa ...