1.new构造方法

  1. class F():
  2. def __new__(cls,*args,**kwargs):
  3. print('这里在原有的基础上做一点事')
  4. return object.__new__(cls)

说明:
1.这里由于是最开始创建对象,如果你不写由于默认继承object会自动帮你创建
2.由于你手动使用new,又在return中调用object.new,我们可以在原有的功能上进行添加
3.参数:cls——类对象
由于这个时候对象并没有生成,所以传递进去的参数是F这个类

2.init初始化方法

  1. class Foo(object):
  2. def __init__(self, name):
  3. self.name = name
  4. obj = Foo("武沛齐")

作用:初始化成员变量(不写系统默认创建无参数的init方法)
参数:self——实例对象

3.call方法

  1. class Hou():
  2. def __call__(self):
  3. print('侯震宇')
  4. # 执行方式1
  5. Hou()()
  6. # 执行方式2
  7. obj1 = Hou()
  8. obj1()
  9. # 执行方式3
  10. Hou.__call__(obj1)
  11. # 执行方式4
  12. obj1.__call__()

作用:执行实例对象的“函数功能”,实质通过括号运算符调用call方法
参数:self ——实例对象

4.str方法

  1. class Hou:
  2. def __str__(self):
  3. print('This is Hou')
  4. obj = Hou()
  5. # 方式一
  6. print(obj)
  7. # 方式二
  8. print(str(obj))
  9. # 方式三
  10. print(Hou.__str__(Hou())
  11. # 方式四
  12. print(Hou().__str__())

作用:str(obj)转化对象的时候,会自动查找str方法
参数:self——实例对象

5.dict

  1. class Hou(object):
  2. def __init__(self,x):
  3. self.name = x
  4. def f1(self):
  5. pass
  6. def f2(self):
  7. pass
  8. obj1 = Hou(19)
  9. # 对象只会输出 成员变量
  10. print(obj1.__dict__)
  11. # 类会输出所有的(包括继承的)类方法和类变量
  12. print(Hou.__dict__)

注意:dict不是方法!不是方法!不是方法!
原因:Hou.dict后面没有括号
如果是对象dict输出的是成员变量
如果是类对象dict输出的是所有的类变量和方法
对象的本质就是字典,所以它是可哈希的

6.getitemsetitemdelitem(重载运算符)[]

  1. class Foo(object):
  2. def __init__(self,name,age):
  3. self.x1 = name
  4. self.x2 = age
  5. self.x3 = 0
  6. def __getitem__(self, key):
  7. if key == 'x1':
  8. return self.name
  9. def __setitem__(self, key, value):
  10. if key == 'x2':
  11. self.x1 = value
  12. def __delitem__(self, key):
  13. if key == 'x3':
  14. del self.x3
  15. obj = Foo("武沛齐", 19)
  16. print(obj["x1"])
  17. obj['x2'] = 123
  18. print(obj.x2)
  19. del obj['x3']
  20. print(obj.x3)

说明:
getitem:除self外,一个参数,调用格式为:obj[参数]
setitem:除self外,两个参数,调用格式为:obj[参数1]=参数2
delitem:除self外,一个参数,调用格式为:del obj[参数]

7.enterexit方法:

  1. class Foo(object):
  2. def __enter__(self):
  3. print("进入了")
  4. return 666
  5. def __exit__(self, exc_type, exc_val, exc_tb):
  6. print("出去了")
  7. obj = Foo()
  8. with obj as data:
  9. print(data)
  10. """过程分析:
  11. 1.with 后面跟的必须是一个对象 这里可以等价替换为with FOO() as data:
  12. 2.obj进入这个对象执行__enter__方法
  13. 3.enter方法执行的return结果返回给data
  14. 4.with后面的语句开始执行
  15. 5.执行完后,进入obj对象中执行__exit__方法
  16. """

8.add方法(重载运算符+)

  1. class F():
  2. def __init__(self,num):
  3. self.num1 = num
  4. def add(self,other):
  5. return '{}+{}*i'.format(self.num1,other)
  6. num1 = F(3)
  7. num2 = F(5)
  8. print(num1 + num2)

重载加法:从左到右次序,诸如此类重载运算符还有:
image.png
image.png
image.png
image.png
https://blog.csdn.net/zhangshuaijun123/article/details/82149056

9.getattrsetattr方法

  1. class Comp():
  2. def __init__(self, real, imag):
  3. self._real = real
  4. self._imag = imag
  5. def __getattr__(self, key):
  6. if key == 'Real':
  7. return self._real
  8. return object.__getattribute__(self, key)
  9. def __setattr__(self, key, value):
  10. if key == 'real':
  11. # print(123,key,value)
  12. self._real = value
  13. # print(self._real)
  14. elif key == 'imag':
  15. self._imag = value
  16. else:
  17. # 如果不是上述内容,使用初始化定义
  18. object.__setattr__(self,key,value)
  19. def __str__(self):
  20. return '{}+{}i'.format(self._real, self._imag)

注意:getattrsetattr会对.运算进行重载,这个比较危险
1.setattr在设定的时候,一定要注明:如果出现其他情况object.getattr(self,key,value)
这个没有返回值,a.x = b
普通的这个句式只是进行了一个操作运算

2.getattr在设定的时候,一定要注明:如果出现其他情况
return object.getattr(self,key,value)
这个具有返回值,a.x
普通句式是获取a.x的内容,需要返回值

3.getattr的key是字符串,setattr的key是字符串,value是本身类型

4.getattr和@property发生冲突时,
由于a.x 事实上判定为函数,所以@property把方法伪装成属性,更贴近函数
所以property覆盖了getattr导致它不执行

5.setattr和@setter发生冲突的时候,setattr覆盖了后者
在object.setattr中应该使用了装饰器@setter,如果
setattr自己写会导致主不调用装饰器
两个在一起,判定setattr覆盖@setter

10.getattr(),setattr(),hasattr(),delattr()

getattr(对象,’成员名称’):getattr一样,这个在外部,那个在内部
这个实际上就是外部调用object.getattr(对象,’成员名称’)
setattr(对象,’成员名称’,值):同上
hasattr(对称,’成员名称’):这个内部调用的也是object.getattr(对象,’成员名称’)
delattr(对象,’成员名称’):一样

11.迭代器与可迭代对象

1.iter方法

类对象中加入了,iter方法后
类对象就变成了可迭代对象

具体表现为:for i in obj # obj是个可迭代对象
这个流程是:先进入obj中查找iter(self)方法
然后根据iter中的指示,进入后续环节

2.next方法

类对象中加入了,next方法后,
如果里面iter方法,这就是一个迭代器
具体表现为:for i in obj # obj是个迭代器
具体流程为:先进入obj中查找iter(self)方法
此时返回的是self 自己本身,接下来再次进入这个对象,查找next方法,
将return的结果赋值给i

  1. class PositiveRange(object):
  2. def __init__(self, *args):
  3. self.step = 1
  4. self.counter = 0
  5. if len(args) == 1:
  6. self.end = args[0]
  7. elif len(args) == 2:
  8. self.counter = args[0] - self.step # 这里要取头,因为后面直接next的
  9. self.end = args[1]
  10. elif len(args) == 3:
  11. self.end = args[1]
  12. self.step = args[2]
  13. self.counter = args[0] - self.step
  14. def __iter__(self):
  15. return self
  16. def __next__(self):
  17. self.counter += self.step
  18. if self.counter > self.end : # 这里要取尾
  19. raise StopIteration()
  20. return self.counter
  21. for item in PositiveRange(10,50,2): # 循环可迭代对象时,内部先执行obj.__iter__并获取迭代器对象;不断地执行迭代器对象的next方法。
  22. print('{: <5}'.format(item),end= '')