这两者也是Python内建,无需自定义。
- class Foo:
- pass
- obj = Foo()
- print(obj.__module__)
- print(obj.__class__)
运行结果:
- main
4. del()
析构方法,当对象在内存中被释放时,自动触发此方法。
注:此方法一般无须自定义,因为Python自带内存分配和释放机制,除非你需要在释放的时候指定做一些动作。析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。
- class Foo:
- def __del__(self):
- print("我被回收了!")
-
- obj = Foo()
- del obj
5. call()
如果为一个类编写了该方法,那么在该类的实例后面加括号,可会调用这个方法。
注:构造方法的执行是由类加括号执行的,即:对象 = 类名(),而对于call() 方法,是由对象后加括号触发的,即:对象() 或者 类()()
- class Foo:
- def __init__(self):
- pass
- def __call__(self, *args, **kwargs):
- print('__call__')
- obj = Foo() # 执行 __init__
- obj() # 执行 __call__
可以用Python内建的callable()函数进行测试,判断一个对象是否可以被执行。
- callable(Student())
运行结果:
- True
6. dict
列出类或对象中的所有成员!非常重要和有用的一个属性,Python自建,无需用户自己定义。
- 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__)
- # 获取 对象obj1 的成员
- obj1 = Province('HeBei',10000)
- print(obj1.__dict__)
- # 获取 对象obj2 的成员
- obj2 = Province('HeNan', 3888)
- print(obj2.__dict__)
7. str()
如果一个类中定义了str()方法,那么在打印对象时,默认输出该方法的返回值。这也是一个非常重要的方法,需要用户自己定义。
下面的类,没有定义str()方法,打印结果是:
- class Foo:
- pass
- obj = Foo()
- print(obj)
- 定义了__str__()方法后,打印结果是:'jack'。
- class Foo:
- def __str__(self):
- return 'jack'
- obj = Foo()
- print(obj)
8、getitem__()、_setitem_()、__delitem()
取值、赋值、删除这“三剑客”的套路,在Python中,我们已经见过很多次了,比如前面的@property装饰器。
Python中,标识符后面加圆括号,通常代表执行或调用方法的意思。而在标识符后面加中括号[],通常代表取值的意思。Python设计了getitem()、setitem()、delitem()这三个特殊成员,用于执行与中括号有关的动作。它们分别表示取值、赋值、删除数据。
也就是如下的操作:
- a = 标识符[] : 执行__getitem__方法
- 标识符[] = a : 执行__setitem__方法
- del 标识符[] : 执行__delitem__方法
如果有一个类同时定义了这三个魔法方法,那么这个类的实例的行为看起来就像一个字典一样,如下例所示:
- class Foo:
- 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'] = 'jack' # 自动触发执行 __setitem__
- del obj['k1'] # 自动触发执行 __delitem__
9. iter()
(编辑:ASP站长网)
|