python 特殊属性及方法详细解析

目录
  • 概述
  • 特殊属性
    • 1、 _ _ name _ _
    • 2、_ _ bases _ _ 和_ _ base _ _ 以及 _ _ mro _ _
    • 3、_ _ class _ _
    • 4、_ _ dict _ _
  • 特殊方法
    • 1、 _ _ subclasses _ _ ()
    • 2、_ _ new _ _ ()、 _ _ init _ _ ()和 _ _ del _ _ ()
    • 3、_ _ repr _ _ ()和 _ _ str _ _ ()
    • 4、_ _ call _ _ ()
    • 5、_ _ lt _ _ ()、_ _ le _ _ ()、_ _ gt _ _ ()、_ _ ge _ _ ()、_ _ eq _ _ ()、_ _ ne _ _ ()
    • 6、_ _ hash _ _ ()

概述

在python中,以单下划线开头的(_a)的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用“from xxx import *”而导入,“单下划线” 开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量;以双下划线开头的(_ _a)代表类的私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据;以双下划线开头和结尾的(_ _a_ _)代表python里特殊方法专用的标识,如 _ _init_ _()代表类的构造函数。

特殊属性

1、 _ _ name _ _

如果是一个对象的调用,则表示类的名称,而不是表示对象的名称;如果当前模块被直接执行(主模块),_ _ name _ _ 存储的是_ _ main _ _ ;如果当前模块是被调用的模块(被导入),则_ _ name _ _存储的是py文件名(模块名称)。

1、表示对象的名称

>>> class A(object):
	a = 1
	def __init__(self):
		self.b = 'c'
>>> a = A()
>>> A.__name__
'A'
>>> a.__name__
Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    a.__name__
AttributeError: 'A' object has no attribute '__name__'

2、表示_ _ main _ _函数的名称,也就是程序的入口,类似于java中main函数

>>> __name__
'__main__'

3、如果当前模块被其他模块调用,则是当前模块的名称

demo1.py

print(__name__)

demo2.py

import demo1

运行demo2.py文件后,得到的结果为:

demo1

2、_ _ bases _ _ 和_ _ base _ _ 以及 _ _ mro _ _

_ _ bases _ _ 表示类的所有基类;_ _ base _ _ 输出类继承的第一个父类(类的基类); _ _ mro _ _ 输出类的层次结构。

>>> class A:
    def __init__(self):
        self.a = 2

>>> class B(A):
    def __init__(self):
        super().__init__()
        self.b = 3

>>> class C(A):
    def __init__(self):
        super().__init__()
        self.c = 4

>>> class D(B, C):
    def __init__(self):
        super().__init__()
        self.d = 5

>>> D.__bases__
(<class '__main__.B'>, <class '__main__.C'>)
>>> D.__base__
<class '__main__.B'>
>>> D.__mro__
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)

3、_ _ class _ _

表示对象的类型,相当于type()函数。

>>> class A:
	def __init__(self):
		self.a = 2

>>> a = A()
>>> a.__class__
<class '__main__.A'>

4、_ _ dict _ _

表示对象和类的一些属性,用一个字典存储起来。

>>> class A:
	a = 1
	b = 2
	def __init__(self):
		self.c = 3
		self.d = 4

>>> a = A()
>>> a.__dict__
{'c': 3, 'd': 4}
>>> A.__dict__
mappingproxy({'__module__': '__main__', 'a': 1, 'b': 2, '__init__': <function A.__init__ at 0x000001CD66F6B8B0>, '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None})

特殊方法

1、 _ _ subclasses _ _ ()

表示类的所有直接子类。

>>> class A:
	    def __init__(self):
	        self.a = 2

>>> class B(A):
	    def __init__(self):
	        super().__init__()
	        self.b = 3

>>> class C(A):
	    def __init__(self):
	        super().__init__()
	        self.c = 4

>>> class D(B, C):
	    def __init__(self):
	        super().__init__()
	        self.d = 5

>>> C.__subclasses__()
[<class '__main__.D'>]
>>> A.__subclasses__()
[<class '__main__.B'>, <class '__main__.C'>]

2、_ _ new _ _ ()、 _ _ init _ _ ()和 _ _ del _ _ ()

_ _ new _ _ ()是一个静态方法,用于根据类型创建实例。Python在调用 _ _ new _ _ ()方法获得实例后,会调用这个实例的_ _ init _ _ ()方法,然后将最初传给 _ _ new _ _ ()方法的参数都传给 _ _ init _ _ ()方法。

_ _ init _ _ ()是一个实例方法,用来在实例创建完成后进行必要的初始化,该方法必须返回None。Python不会自动调用父类的 _ _ init _ _ ()方法,这需要额外的调用:

super(C, self). _ _ init _ _ ()

_ _ new _ _ ()至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供;_ _ new _ _ ()必须要有返回值,返回实例化出来的实例,可以return父类new出来的实例,或直接是object的new出来的实例。

>>> class A(object):
		def __new__(cls, *args, **kwargs):
			print("__new__")
			instance = object.__new__(cls)
			# 或者
			# instance = super().__new__(cls)
			return instance

		def __init__(self):
			print("__init__")

>>> a = A()
__new__
__init__

在GC之前,Python会调用这个对象的 _ _ del _ _ ()方法完成一些终止化工作。如果没有 _ _ del _ _ ()方法,那么Python不做特殊的处理;此外,Python无视_ _ del _ _ ()方法的返回值;Python不会自动调用父类的 _ _ del _ _ ()方法,除非显式调用;定义了 _ _ del _ _ ()方法的实例无法参与到循环GC中,所以对于这样的实例应该避免循环引用;try/finally语句或with语句可能是比_ _ del _ _()更好的方式。

>>> class A(object):
	    def __new__(cls, *args, **kwargs):
	        print("__new__")
	        instance = super().__new__(cls, *args, **kwargs)
	        return instance

	    def __init__(self):
	        print("__init__")

	    def __del__(self):
	        print("__del__")

>>> a = A()
__new__
__init__
>>> del a
__del__

3、_ _ repr _ _ ()和 _ _ str _ _ ()

_ _ repr _ _ ()是一个 ”自我描述“ 的方法,也是Python类中的一个特殊方法,由object对象提供,由于object提供的这个 _ _ repr _ _ 方法总是返回一个对象, ( 类名 + obejct at + 内存地址 ),这个值并不能真正实现自我描述的功能,如果你想在自定义类中实现 “自我描述” 的功能,那么必须重写 _ _ repr _ _ 方法。_ _ repr _ _ ()方法返回的字符串主要是面向解释器的。

>>> class A(object):
	    def __repr__(self):
	        return "this is a class A"

>>> a = A()
>>> a
this is a class A
>>> print(a)
this is a class A
>>> str(a)
'this is a class A'

_ _ str _ _ ()与_ _ repr _ _ ()返回的详尽的、准确的、无歧义的对象描述字符串不同,_ _ str _ _ ()方法只是返回一个对应对象的简洁的字符串表达形式。如上代码所示,当_ _ str _ _ ()缺失时,Python会调用_ _ repr _ _ ()方法。

>>> class A(object):
	    def __str__(self):
	        return "this is a class A"

>>> a = A()
>>> a
<__main__.A object at 0x000001CF8C8F9640>
>>> print(a)
this is a class A
>>> str(a)
'this is a class A'

实际上_ _ str _ _ ()只是覆盖了_ _ repr _ _ ()以得到更友好的用户显示。Python内置的str()函数,print(x)语句,都会调用对象的_ _ str _ _()方法。

>>> class A(object):
    def __repr__(self):
        return "class A"

    def __str__(self):
        return "this is a class A"

>>> a = A()
>>> a
class A
>>> print(a)
this is a class A
>>> str(a)
'this is a class A'

4、_ _ call _ _ ()

定义了该方法的对象可以像函数那样被调用,因此被称为可调用对象。

>>> class A(object):
	    def __init__(self):
	        self.a = 2

	    def __call__(self, b, *args, **kwargs):
	        c = b + self.a
	        return c
>>> a = A()
>>> a(3)
5

5、_ _ lt _ _ ()、_ _ le _ _ ()、_ _ gt _ _ ()、_ _ ge _ _ ()、_ _ eq _ _ ()、_ _ ne _ _ ()

当两个对象x、y分别进行x<y、x<=y、x>y、x>=y、x==y和x!=y运算时,会调用对应的函数。

>>> class A(object):
	    def __init__(self, b):
	        self.b = b

	    def __lt__(self, other):
	        print("__lt__")
	        return self.b < other.b

>>> c = A(3)
>>> d = A(4)
>>> c < d
__lt__
True

6、_ _ hash _ _ ()

三种情形会调用__hash__()方法:1. 内置的hash()方法,2.作为字典的键时,3.作为集合的成员时;_ _ hash _ _ ()方法应该返回一个32位长的整数,对与同一个对象,hash()方法应该总是返回相同的值;对于 x == y ,即使二者不属于相同的类型,只要他们是可哈希的(hashable),都应该确保得到 hash(x) == hash(y) ;

>>> class A(object):
	    def __init__(self, n):
	        self.n = n

	    def __eq__(self, other):
	        return self.n == other.n

	    def __hash__(self):
	        return random.randint(0, 10)

>>> a = A(3)
>>> b = A(3)
>>> a == b
True
# 虽然a == b返回结果为True,但是hash(a)和hash(b)返回结果不一样,所以不能说这两个对象是相同的。
>>> hash(a)
3
>>> hash(b)
5

_ _ eq _ _()正确的用法:

class A(object):
	def __init__(self, n):
	    self.n = n

	def __hash__(self):
        return hash(id(self))

    def __eq__(self, other):
        if isinstance(other, self.__class__):
            return hash(id(self))==hash(id(other))
        else:
            return False 

通过_ _ hash _ _ 返回一个int值,用来标记这个对象。对于类而言,如果没有实现_ _ eq _ _ ()和 _ _ hash _ _ ()函数,那么会自动继承object._ _ hash _ _()。

到此这篇关于python 特殊属性及方法详细解析的文章就介绍到这了,更多相关python 属性方法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python特殊属性property原理及使用方法解析

    1 什么是特性property property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值 import math class Circle: def __init__(self,radius): #圆的半径radius self.radius=radius @property def area(self): return math.pi * self.radius**2 #计算面积 @property def perimeter(self): return 2*math.pi*

  • Python面向对象特殊属性及方法解析

    特殊属性 Python中对象包括很多双下划綫开始和结束的属性,这些特殊属性,有特殊用法. 特殊方法 含义 obj.__dict__ 对象的属性字典 obj.__class__ 对象所处的类 class.__bases__ 类的基本元组(多继承) class.__base__ 类的基类 class.__mro__ 类层次结构 class.__subclasses__() 子类列表 代码如下 class A: pass class B: pass class C(A,B): def __init__

  • python 特殊属性及方法详细解析

    目录 概述 特殊属性 1. _ _ name _ _ 2._ _ bases _ _ 和_ _ base _ _ 以及 _ _ mro _ _ 3._ _ class _ _ 4._ _ dict _ _ 特殊方法 1. _ _ subclasses _ _ () 2._ _ new _ _ (). _ _ init _ _ ()和 _ _ del _ _ () 3._ _ repr _ _ ()和 _ _ str _ _ () 4._ _ call _ _ () 5._ _ lt _ _ ()

  • Python复数属性和方法运算操作示例

    本文实例讲述了Python复数属性和方法运算操作.分享给大家供大家参考,具体如下: #coding=utf8 ''''' 复数是由一个实数和一个虚数组合构成,表示为:x+yj 一个负数时一对有序浮点数(x,y),其中x是实数部分,y是虚数部分. Python语言中有关负数的概念: 1.虚数不能单独存在,它们总是和一个值为0.0的实数部分一起构成一个复数 2.复数由实数部分和虚数部分构成 3.表示虚数的语法:real+imagej 4.实数部分和虚数部分都是浮点数 5.虚数部分必须有后缀j或J 复

  • Python 动态绑定属性和方法 

    Python是动态语言,在创建对象后,可以动态地绑定属性和方法 定义类: class Student:  #定义类     #在__init__初始化方法中定义的属性是Student类的所有对象共享的属性,如self.name,self.age     def __init__(self,name,age):  #__init__初始化方法         self.name=name    #将局部变量name,赋值给实例变量         self.age=age     def eat(

  • 一篇文章彻底搞懂Python类属性和方法的调用

    目录 一.类.对象概述 二.类的定义与使用 三.类属性和类方法的调用 四.私有成员与公有成员 总结 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的. 一.类.对象概述 在面向对象程序设计中,把数据以及对数据的操作封装在一起,组成一个整体(对象),不同对象之间通过消息机制来通信或者同步.对于相同类型的对象进行分类.抽象后,得出共同的特征而形成了类. 类的抽象具体包括两个方面: 1.数据抽象:描述某类对象共有的属性或状态. 2.过程抽象:描述

  • Python私有属性私有方法应用实例解析

    01. 应用场景及定义方式 应用场景 在实际开发中,对象 的 某些属性或方法 可能只希望 在对象的内部被使用,而 不希望在外部被访问到 私有属性 就是 对象 不希望公开的 属性 私有方法 就是 对象 不希望公开的 方法 定义方式 在 定义属性或方法时,在 属性名或者方法名前 增加 两个下划线,定义的就是 私有 属性或方法 class Women: def __init__(self, name): self.name = name # 不要问女生的年龄 self.__age = 18 def _

  • python私有属性和方法实例分析

    本文实例分析了python的私有属性和方法.分享给大家供大家参考.具体实现方法如下: python默认的成员函数和成员变量都是公开的,并且没有类似别的语言的public,private等关键词来修饰. 在python中定义私有变量只需要在变量名或函数名前加上 "__"两个下划线,那么这个函数或变量就会为私有的了. 在内部,python使用一种 name mangling 技术,将 __membername替换成 _classname__membername,所以你在外部使用原来的私有成

  • location对象的属性和方法应用(解析URL)

    location对象提供了很多属性和方法用来解析URL. 复制代码 代码如下: <head> <title></title> <script type="text/javascript"> var uristr = window.location.search.substr(1); var array = uristr.split('&&'); for (var i = 0; i < array.length; i+

  • JavaScript之IE的fireEvent方法详细解析

    在IE中提供了一个fireEvent方法,顾名思义就是触发某个事件发生的意思.刚开始我以为是会跟平时使用onclick()一样,没想到最近在写javascript入门ppt的时候发现了,原来自己太自以为是了!看来还有很多javascript的细节没有掌握好啊! 现在根据自己的总结详细的记录下fireEvent方法的使用.fireEvent是IE提供的一种方法,msdn文档地址:http://msdn.microsoft.com/en-us/library/ms536423(v=vs.85).as

  • JavaScript中的全局属性与方法深入解析

    今天来补充JavaScript中的最后一部分内容,JavaScript中的全局属性和方法(函数). 1.全局属性 // 属性 // Infinity 代表正的无穷大的数值. // 在Javascript中,超出 1.7976931348623157E+103088 的数值即为Infinity,小于 -1.7976931348623157E+103088 的数值为无穷小. var num1 = 1.7976931348623157E+103088; var num2 = -1.7976931348

  • react-redux中connect()方法详细解析

    组件 React-Redux将所有组件分为两大类:展示组件(UI组件),容器组件 展示组件有以下几个特征: 只负责 UI 的呈现,不带有任何业务逻辑 没有状态(即不使用this.state这个变量) 所有数据都由参数(this.props)提供 不使用任何 Redux 的 API 容器组件有以下几个特征: 负责管理数据和业务逻辑,不负责 UI 的呈现 带有内部状态 使用 Redux 的 API 总结为一点: 展示组件负责 UI 的呈现,容器组件负责管理数据和逻辑 connect方法解析 下图是c

随机推荐