Python 学习笔记 - 面向对象(特殊成员)

下面是类的特殊成员,当我们执行一些特定操作时候,会自动调用这些特殊的方法

1. __doc__

  表示类的描述信息

>>> class Foo:
    """ 描述类信息,这是用于看片的神奇 """
    def func(self):
        pass
print (Foo.__doc__)
#输出:类的描述信息
-------------
 描述类信息,这是用于看片的神奇

2. __module__ 和  __class__ 

  __module__ 表示当前操作的对象在那个模块

  __class__     表示当前操作的对象的类是什么

from qq import person
John=person(‘John‘,‘male‘,30,20)
print(John.__module__)
print(John.__class__)
--------------
qq
<class ‘qq.person‘>

3. __init__

  构造方法,通过类创建对象时,自动触发执行

class Foo:
    def __init__(self, name):
        self.name = name
        self.age = 18

obj = Foo(‘aa‘) # 自动执行类中的 __init__ 方法

4. __del__

  析构方法,当对象在内存中被释放时,自动触发执行。

注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。

5. __call__

  对象后面加括号,触发执行。

注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

class Foo:
    def __init__(self):
        pass
    def __call__(self, *args, **kwargs):
        print(‘__call__‘)
obj = Foo()  # 执行 __init__
obj()  # 执行 __call__
-----
__call__

6. __dict__

  类或对象中的所有成员

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__)
# 输出:{‘country‘: ‘China‘, ‘__module__‘: ‘__main__‘, ‘func‘: <function func at 0x10be30f50>, ‘__init__‘: <function __init__ at 0x10be30ed8>, ‘__doc__‘: None}
obj1 = Province(‘HeBei‘,10000)
print (obj1.__dict__)
# 获取 对象obj1 的成员
# 输出:{‘count‘: 10000, ‘name‘: ‘HeBei‘}
obj2 = Province(‘HeNan‘, 3888)
print (obj2.__dict__)
# 获取 对象obj1 的成员
# 输出:{‘count‘: 3888, ‘name‘: ‘HeNan‘}
--------------
{‘country‘: ‘China‘, ‘func‘: <function Province.func at 0x000002286C21C620>, ‘__dict__‘: <attribute ‘__dict__‘ of ‘Province‘ objects>, ‘__doc__‘: None, ‘__weakref__‘: <attribute ‘__weakref__‘ of ‘Province‘ objects>, ‘__module__‘: ‘__main__‘, ‘__init__‘: <function Province.__init__ at 0x000002286C21C598>}
{‘count‘: 10000, ‘name‘: ‘HeBei‘}
{‘count‘: 3888, ‘name‘: ‘HeNan‘}

 7. __str__

  如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。

>>> class Foo:
    def __str__(self):
        return ‘hhh‘
obj = Foo()
print(obj)
hhh

8、__getitem__、__setitem__、__delitem__

用于索引操作,如字典。以上分别表示获取、设置、删除数据;也可以用于列表操作,分别表示获取,切片,删除

字典操作

>>> 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()
result = obj[‘k1‘]  # 自动触发执行 __getitem__
obj[‘k2‘] = ‘bb‘  # 自动触发执行 __setitem__
del obj[‘k1‘]  # 自动触发执行 __delitem__
__getitem__ k1
__setitem__ k2 bb
__delitem__ k1


列表操作(切片)

>> class Foo(object):
    def __getitem__(self, key):
        print(‘__getitem__‘, key,type(key))
    def __setitem__(self, key, value):
        print(‘__setitem__‘, type(key), type(value))
    def __delitem__(self, key):
        print(‘__delitem__‘, key)
obj = Foo()
result=obj[0:3]
print(result)
obj[1:3]=[2,3,4,5,6,7]
del obj[2:3]
----------------------
__getitem__ slice(0, 3, None) <class ‘slice‘>
None
__setitem__ <class ‘slice‘> <class ‘list‘>
__delitem__ slice(2, 3, None)



9. __iter__ 

用于迭代器,之所以列表、字典、元组可以进行for循环,是因为类型内部定义了 __iter__

>>> class Foo(object):
    def __init__(self, sq):
        self.sq = sq
    def __iter__(self):
        return iter(self.sq)
obj = Foo([11,22,33,44])
for i in obj:
    print(i)
------------
11
22
33
44
时间: 2024-08-11 03:24:02

Python 学习笔记 - 面向对象(特殊成员)的相关文章

Python学习笔记-面向对象

一.什么是面向对象的程序设计 1.面向过程的程序设计 面向过程:核心是过程二字,过程即解决问题的步骤,就是先干什么,再干什么.基于该思想写程序就好比在设计一条流水线,是一种机械式的思维方式. 优点:复杂的过程流程化,进而简单化 缺点:扩展性差 2.面向对象的程序设计 面向对象:核心是对象二字,对象是特征与技能的结合体.基于该思想编写程序就好比在创造一个世界,世界是由一个个对象组成,是一种"上帝式"的思维方式 优点:可扩展性强 缺点:编程复杂度高,容易出现过度设计问题 二.类与对象 对象

Python 学习笔记 - 面向对象(类成员)

上一篇学习了Python面向对象的3大特性,封装,继承和多态,这一篇继续学习类成员,包括字段,方法,属性以及他们的修饰符. 1.字段 字段分为静态字段和普通字段.静态字段属于类,而普通字段属于对象,因此静态字段在内存中只保存一份,而普通字段在每个对象中都保存了一份.定义的时候静态字段定义在类的范围里面,而普通字段定义在方法里面. 例如: >>> class Foo:     # 字段(静态字段)     CC = 123     def __init__(self):         #

Python学习笔记——面向对象编程

接下来学习面向对象编程,基础的就不记录了,只记录一些Python特有的或者高级的特性. http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318645694388f1f10473d7f416e9291616be8367ab5000 1. 类的定义 定义类使用class关键字,后面紧跟类名(首字母大写),接着是从哪个类继承下来的(所有类最终会继承object). 通过类名加参

Python 学习笔记 - 面向对象(基础)

之前学习的编程方式都是通过面向过程来实现的,对于一些重用的代码,进一步的使用了函数,增强了代码的可读性和重用性.Python同时还支持面向对象的编程. 面向对象有三大特性: 封装 继承 多态 首先来看看封装.封装包括两点,把内容封装到某个地方:调用封装的内容 例1: class c1:     def __init__(self,name,obj):         self.name = name         self.obj = obj class c2:     def __init_

Python学习笔记-面向对象进阶(二)

一.反射 1.什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省). 2.Python面向对象中的反射 通过字符串的形式操作对象相关的属性.python中的一切事物都是对象(都可以使用反射) 3.四个可以实现自省的函数 (1)hasattr(object,name),判断object中有没有一个name字符串对应的方法或属性,检测是否含有某属性. class BlackMedium: feture='Ugly' def _

python学习笔记--面向对象的编程和类

一.面向对象的编程 面向对象程序设计--Object Oriented Programming,简称oop,是一种程序设计思想.二.面向对象的特性类:class类,对比现实世界来说就是一个种类,一个模型.一个类即是对一类拥有相同属性的对象的抽象.蓝图.原型.在类中定义了这些对象的都具备的属性(variables(data)).共同的方法. 对象:object对象,也就是指模型造出来的具体的东西.一个对象即是一个类的实例化后实例,一个类必须经过实例化后方可在程序中调用,一个类可以实例化多个对象,每

Python 学习笔记 - 面向对象(其他)

这是面向对象的最后一个部分. 首先看两个函数. 1.isinstance(obj, cls) 检查是否obj是否是类 cls 的对象 2.issubclass(sub, super) 检查sub类是否是 super 类的派生类 class Bar:     pass class Foo(Bar):     pass obj = Foo() # obj,Bar(obj类型和obj类型的父类)的实例 ret = isinstance(obj, Bar) print(ret) ret = issubc

Python学习笔记——面向对象基础

1.类和实例 1.1类的定义 类的定义使用class关键字,其后紧跟类名(通常大写开头),紧接着是(object),object是该类继承的类名,没有就继承object类. 实例化时就是类名+(),有参数需要传入参数. class Student(object): pass bart = Student() 类的属性定义在_init_方法中(相当于java的构造方法),该方法的第一个参数永远是self,在实例化时必须传入相应的参数(除self外) class Student(object): d

Python学习笔记-面向对象进阶(一)封装、多态、继承

一.初识继承 1.什么是继承? 继承是一种创建新类的方式,新建的类可以继承一个或多个父类(python支持多继承),父类又可称为基类或超类,新建的类称为派生类或子类.子类会"遗传"父类的属性,从而解决代码重用问题. # python中类的继承分为:单继承和多继承 class ParentClass1: #定义父类 pass class ParentClass2: #定义父类 pass class SubClass1(ParentClass1): #单继承,基类是ParentClass1