C# 对象作为参数_史上最全 Python 面向对象编程( 四 )


具体使用 1. doc
说明性文档和信息 。自建,无需自定义 。
class Foo:""" 描述类信息,可被自动收集 """def func(self):pass# 打印类的说明文档 print(Foo.__doc__)
2. init()
实例化方法,通过类创建实例时,自动触发执行 。
class Foo:def __init__(self, name):self.name = nameself.age = 18obj = Foo(jack') # 自动执行类中的 __init__ 方法
3.和
表示当前操作的对象在属于哪个模块 。
class 表示当前操作的对象属于哪个类 。
这两者也是内建,无需自定义 。
class Foo:passobj = Foo()print(obj.__module__)print(obj.__class__)运行结果:main
4. del()
析构方法,当对象在内存中被释放时,自动触发此方法 。
注:此方法一般无须自定义,因为自带内存分配和释放机制,除非你需要在释放的时候指定做一些动作 。析构函数的调用是由解释器在进行垃圾回收时自动触发执行的 。
【C# 对象作为参数_史上最全 Python 面向对象编程】class Foo:def __del__(self):print("我被回收了!")obj = Foo()del obj
5. call()
如果为一个类编写了该方法,那么在该类的实例后面加括号,可会调用这个方法 。
注:构造方法的执行是由类加括号执行的,即:对象 = 类名(),而对于call() 方法,是由对象后加括号触发的,即:对象() 或者 类()()
class Foo:def __init__(self):passdef __call__(self, *args, **kwargs):print('__call__')obj = Foo()# 执行 __init__obj()# 执行 __call__
可以用内建的()函数进行测试,判断一个对象是否可以被执行 。
callable(Student())
运行结果:
True
6. dict
列出类或对象中的所有成员!非常重要和有用的一个属性,自建,无需用户自己定义 。
class Province:country = 'China'def __init__(self, name, count):self.name = nameself.count = countdef 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:passobj = Foo()print(obj)定义了__str__()方法后,打印结果是:'jack' 。class Foo:def __str__(self):return 'jack'obj = Foo()print(obj)
8、()、()、()
取值、赋值、删除这“三剑客”的套路,在中,我们已经见过很多次了,比如前面的@装饰器 。
中,标识符后面加圆括号,通常代表执行或调用方法的意思 。而在标识符后面加中括号[],通常代表取值的意思 。设计了()、()、()这三个特殊成员,用于执行与中括号有关的动作 。它们分别表示取值、赋值、删除数据 。
也就是如下的操作:
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__