★ 静态方法、实例方法、类方法
项目 | 操作对象 | 调用方式 |
---|---|---|
静态方法 | 既不操作类也不操作实例对象 | 类或实例对象 |
实例方法 | 操作实例属性 | 实例对象 |
类方法 | 操作类属性 | 类或实例对象 |
★ python私有方法和私有属性理解
-
规律总结
1.私有的属性,不能通过对象直接访问,但是可以通过方法访问; 本质是私有属性名被重整(在私有属性名前追加"_类名",而使用方法访问时会自动补全这个前缀) 2.私有的方法,不能通过对象直接访问(私有方法名重整) 3.私有的属性、方法,不会被子类继承,也不能被直接访问
-
说明
1.私有化本质上就是名字重整 2.一般情况下,私有的属性、方法都是不对外公布的,往往用来做内部的事情,起到安全的作用; 如果子类需要用到父类的私有属性和方法, 可以在父类中定义公有方法,在子类中间接的访问父类的私有方法、属性
★ 类的常见魔法方法
-
__doc__
类的描述信息class Foo: """ 描述类信息,这是用于看片的神器 """ def func(self): pass print(Foo.__doc__) """ <程序执行结果>: 描述类信息,这是用于看片的神器 """
-
__module__
当前操作的对象在那个模块 -
__class__
当前操作的对象在那个模块from test import Person obj = Person() print(obj.__module__) print(obj.__class__) """ <程序执行结果>: test <class 'test.Person'> """
-
__del__
当对象在内存中被释放时自动触发执行class Foo: def __del__(self): print(f"{self} 对象被删除") f1 = Foo() del f1 """ <程序执行结果>: <__main__.Foo object at 0x7f96e8125d90> 对象被删除 """
-
__init__
初始化对象时触发执行 -
__call__
对象后面加括号时触发执行class Foo: def __init__(self): print('__init__ 被调用') def __call__(self, *args, **kwargs): print('__call__ 被调用') f1 = Foo() print("--------------") f1() """ <程序执行结果>: __init__ 被调用 -------------- __call__ 被调用 """
-
__dict__
查看对象的属性时触发执行class Foo: COUNT = 0 def __init__(self, name): self.name = name def say_hello(self): print(f"hello {self.name} ") f1 = Foo("demo") # 获取对象f1的所有属性 print(f1.__dict__) # 获取对象f1类的所有属性 print(f1.__class__.__dict__) """ <程序执行结果>: {'name': 'demo'} {'__module__': '__main__', 'COUNT': 0, '__init__': <function Foo.__init__ at 0x7ff3c00e5c20>, 'say_hello': <function Foo.say_hello at 0x7ff3e00ca440>, '__dict__': <attribute '__dict__' of 'Foo' objects>, '__weakref__': <attribute '__weakref__' of 'Foo' objects>, '__doc__': None} """
-
__str__
如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。class Foo1: pass class Foo2: def __str__(self): return 'Foo2' f1 = Foo1() f2 = Foo2() print(f1) print(f2) """ <程序执行结果>: <__main__.Foo1 object at 0x7fe2b000f2d0> Foo2 """
-
__xxitem__
对象索引操作class Foo(object): 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() # 对象获取操作,触发 __getitem__ result = obj['k1'] # 对象设置操作,触发 __setitem__ obj['k2'] = 'laowang' # 对象删除操作,触发 __delitem__ del obj['k1'] """ <程序执行结果>: __getitem__ k1 __setitem__ k2 laowang __delitem__ k1 """
-
slice
对象切片操作""" Python3 的官方文档可知,Python3中的切片的魔术方法不再是Python2中的getslice(), setslice()和delslice(),而是借助 slice 类整合到了getitem(),setitem()和 delitem()中。 """ class Foo(object): def __getitem__(self, index): if isinstance(index, slice): print(f"【slice-get】>> start: {index.start}, stop: {index.stop}, step: {index.step}") def __setitem__(self, index, value): if isinstance(index, slice): print(f"【slice-set】>> start: {index.start}, stop: {index.stop}, step: {index.step}") print(f"【slice-set】>> The value is:", value) def __delitem__(self, index): if isinstance(index, slice): print(f"【slice-del】>> start: {index.start}, stop: {index.stop}, step: {index.step}") obj = Foo() # 对象切片获取操作 obj[-1:1] # 对象切片修改操作 obj[-1:10:1] = [11, 22, 33, 44] # 对象切片删除操作 del obj[-1:10:2] """ <程序执行结果>: 【slice-get】>> start: -1, stop: 1, step: None 【slice-set】>> start: -1, stop: 10, step: 1 【slice-set】>> The value is: [11, 22, 33, 44] 【slice-del】>> start: -1, stop: 10, step: 2 """