0
点赞
收藏
分享

微信扫一扫

python学习高级篇(part7)--特殊属性和特殊方法

学习笔记,仅供参考,有错必纠


文章目录

  • ​​python 学习高级篇​​
  • ​​特殊属性和特殊方法​​
  • ​​获取对象的信息之特殊属性`__dict__`​​
  • ​​获取对象的信息之反射​​
  • ​​类对象的特殊方法`__len__()`​​

python 学习高级篇



# 支持多行输出
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = 'all' #默认为'last'



特殊属性和特殊方法



调用内置函数dir()后的返回值中,很多属性和方法都是以双下划线​​__​​开头和结尾的,这些属性和方法中的绝大多数都继承自类object.



以双下划线​​__​​​开头和结尾的属性被称为特殊属性,以双下划线​​__​​​开头和结尾的方法被称为特殊方法。特殊属性和特殊方法都是系统预定义的,我们自定义的属性名和方法名不要以双下划线​​__​​​开头和结尾。在我们自定义类对象时,经常会重写一个或多个特殊方法,例如​​__init__​​。特殊方法会在特定的情形下被自动调用,很少需要手动调用特殊方法。

print(dir(object))
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']



获取对象的信息之特殊属性​​__dict__​



对于指定的类对象或实例对象,可以访问特殊属性​​__dict__​​获得该类对象或实例对象所绑定的所有属性和方法的字典。

其中,字典中的键为属性名或方法名。

class MyClass(object):
ca = 'ca'

def __init__(self):
self.ia = 'ia'

def im(self):
pass

@classmethod
def cm(cls):
pass

@staticmethod
def sm():
pass

MyClass.ca2 = 'ca2'
print(MyClass.__dict__)
{'__module__': '__main__', 'ca': 'ca', '__init__': <function MyClass.__init__ at 0x0000019632EE58C8>, 'im': <function MyClass.im at 0x0000019632EE5950>, 'cm': <classmethod object at 0x0000019632EEE3C8>, 'sm': <staticmethod object at 0x0000019632EEE438>, '__dict__': <attribute '__dict__' of 'MyClass' objects>, '__weakref__': <attribute '__weakref__' of 'MyClass' objects>, '__doc__': None, 'ca2': 'ca2'}
mc = MyClass()
mc.ia2 = 'ia2'
print(mc.__dict__)
{'ia': 'ia', 'ia2': 'ia2'}



获取对象的信息之反射



所谓’反射’,指的是以字符串的形式来操作(包括:增删改查)对象的属性和方法。



python学习高级篇(part7)--特殊属性和特殊方法_内置函数



class MyClass(object):
def __init__(self):
self.x = 1

def do_sth(self):
print("do_sth被调用")

mc = MyClass()

print(hasattr(mc, 'x'))
print(hasattr(mc, 'do_sth'))
print(hasattr(mc, 'y'))

print(getattr(mc, 'x'))

f = getattr(mc, 'do_sth')
f()

# print(getattr(mc, 'y'))
print(getattr(mc, 'y', 2))

setattr(mc, 'z', 3)
print(getattr(mc, 'z'))

setattr(mc, 'z', 4)
print(getattr(mc, 'z'))

delattr(mc, 'z')
print(hasattr(mc, 'z'))
True
True
False
1
do_sth被调用
2
3
4
False



类对象的特殊方法​​__len__()​



# 内置函数len()用于返回对象的长度
print(len([1, 2, 3, 4, 5]))
print(len('abcde'))
print(len({'a': 1, 'b': 2, 'c': 3}))
5
5
3

在上面的例子中,内置函数len()的实参都是内置类对象的实例对象,例如:

[1, 2, 3, 4, 5] 是内置类对象list的一个实例对象;

{‘a’: 1, ‘b’: 2, ‘c’: 3} 是内置类对象dict的一个实例对象。

# 内置函数len()的实参在默认情况下不能是自定义类对象的实例对象。
class MyClass(object):
pass

print(len(MyClass())) # object of type 'MyClass' has no len()
---------------------------------------------------------------------------

TypeError Traceback (most recent call last)

<ipython-input-14-ecf26a5a6c12> in <module>()
3 pass
4
----> 5 print(len(MyClass()))


TypeError: object of type 'MyClass' has no len()

如果想让内置函数len()的实参可以是自定义类对象的实例对象,必须在自定义类对象中实现特殊方法​​__len__()​​​。这样,调用内置函数len()时,在其内部会自动调用实参所对应类对象的特殊方法​​__len__()​​​。之所以内置函数len()的实参可以是上述内置类对象的实例对象,是因为上述的内置类对象中都实现了特殊方法​​__len__()​​.

class MyClass(object):
def __len__(self):
return 18

print(len(MyClass()))




举报

相关推荐

0 条评论