Python 魔术方法
1、特殊属性
2、查看属性
-
__dir__
返回类或者对象的所有成员名称列表 -
dir()
函数操作实例就是调用__dir__()
-
如果
dir([obj])
参数obj包含方法__dir__()
,该方法将被调用 -
如果参数
obj
不包含__dir__()
,该方法将最大限度地收集属性信息 -
dir(obj)
对于不同类型的对象obj具有不同的行为:1 如果对象是模块对象,返回的列表包含模块的属性名和变量名
2 如果对象是类型或者说是类对象,返回的列表包含类的属性名,及它的祖先类的属性名
3 如果是类的实例
有__dir__
方法,返回可迭代对象的返回值
没有__dir__
方法,则尽可能收集实例的属性名、类的属性和祖先类的属性名4 如果
obj
不写,返回列表包含内容不同
在模块中,返回模块的属性和变量名
在函数中,返回本地作用域的变量名
在方法中,返回本地作用域的变量名 -
locals()
返回当前作用域中的变量字典 -
globals()
当前模块全局变量的字典
2.1 示例 1
class Animal:
x = 123
def __init__(self, name):
self._name = name
self.__age = 10
self.weight = 20
dir(Animal)
['__class__',
'__delattr__',
'__dict__',
'__dir__',
'__doc__',
'__eq__',
'__format__',
'__ge__',
'__getattribute__',
'__gt__',
'__hash__',
'__init__',
'__init_subclass__',
'__le__',
'__lt__',
'__module__',
'__ne__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__sizeof__',
'__str__',
'__subclasshook__',
'__weakref__',
'x']
dir(Animal('Sybil'))
['_Animal__age',
'__class__',
'__delattr__',
'__dict__',
'__dir__',
'__doc__',
'__eq__',
'__format__',
'__ge__',
'__getattribute__',
'__gt__',
'__hash__',
'__init__',
'__init_subclass__',
'__le__',
'__lt__',
'__module__',
'__ne__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__sizeof__',
'__str__',
'__subclasshook__',
'__weakref__',
'_name',
'weight',
'x']
class Cat(Animal):
y = 'abc'
dir(Cat)
['__class__',
'__delattr__',
'__dict__',
'__dir__',
'__doc__',
'__eq__',
'__format__',
'__ge__',
'__getattribute__',
'__gt__',
'__hash__',
'__init__',
'__init_subclass__',
'__le__',
'__lt__',
'__module__',
'__ne__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__sizeof__',
'__str__',
'__subclasshook__',
'__weakref__',
'x',
'y']
3、魔术方法
3.1 实例化 __new__
- 1 实例化一个对象;构造实例的时候,先调用
__new__
方法;返回的是一个实例,然后继续调用__init__
方法,进行出厂配置 - 2 该方法需要返回一个值,如果该值不是
cls
的实例,则不会调用__init__
- 3 该方法永远都是静态方法,第一个参数
cls
需要手动输入,不会自动注入任何参数 - 4
__init__
方法很少使用,即使创建了该方法,也会使用return super().__new__(cls)
基类object
的__new__
方法来创建实例并返回
class A:
def __new__(cls, *args, **kwargs):
print('new')
print(cls)
print(args)
print(kwargs)
return super().__new__(cls)
# return None
def __init__(self, name):
print('init')
self.name = name
a = A('name')
new
<class '__main__.A'>
('name',)
{
}
init
3.2 可视化
__str__:str() format() print()
函数调用,需要返回对象的字符串表达。如果没有定义,就去调用__repr__
方法返回字符串表达。如果__repr__
没有定义,就直接返回对象的内存地址__repr__
:内建函数repr()
对一个对象获取字符串表达。如果__repr__
没有定义,就直接返回对象的内存地址__bytes__:bytes()
函数调用,返回一个对象的bytes
表达,即返回bytes
对象- 注意不能通过判断是否带引号来判断输出值的类型,类型判断要使用
type
或者isinstance
- 直接作用对象 调用
str
,但是间接作用也可以使用str
- 间接作用 优先调用
repr
例如:[] ()
- 如果没定义
repr
,就会调基类的repr
- 不能根据打印形式来判断数据类型,打印出来的全是给人看的,并不用真实数据类型
class A:
def __init__(self