Python 学习(5)---类的相关知识整理(续)

Python 是一门很灵活、很方便的语言。学起来很顺手,我们可以用它快捷的完成许多实际任务,下面是我学习python的过程中整理的基本知识点。

面向对象的编程是当今最主流的编程思想,类的三大特性:封装、继承、多态是面向对象编程的优势所在,下面是我整理的相关知识点。

类的魔法方法:

# -*- coding:utf-8 -*-
__author__ = 'Microcosm'

print("-------------------类的魔法方法------------------------")
# 类的魔法方法是被双下划线包围的方法,如之前学过的__init__(self)方法
# __new__(cls[,]) 该魔法方法是类实例化对象的时候第一个被自动调用的方法,
#                 通常不需要重写,只有在需要继承不可变类的时候需要重写
class CapStr(str):
    def __init__(self,string):    # 这里的参数个数得与__new__()保持一致,且这个魔法方法只能返回None
        print("我是__init__方法,我被调用了...")
    def __new__(cls, string):
        string = string.upper()
        print("我是__new__方法,我被调用了...")
        return str.__new__(cls,string)

a = CapStr("I love you!")
print a

# __del__(self) 该方法是类的析构器,当类实例对象没有被引用的时候会自动调用这个方法回收垃圾
class C:
    def __init__(self):
        print("我是__init__方法,我被调用了...")
    def __del__(self):
        print("我是__del__方法,我被调用了...")
c1 = C()
c2 = c1
c3 = c2
del c3
del c2
del c1    # 当所有指向类对象的变量都被删除后才调用__del__方法,最好在命令行一步步观察比较好

print("=======================================================")
# 算术运算
class New_int(int):
    def __add__(self, other):
        return int.__sub__(self,other)
    def __sub__(self, other):
        return int.__add__(self,other)

a = New_int(3)
b = New_int(5)
print a + b   # 实际上调用了int的减法,返回值为-2
print a - b   # 实际上调用了int的加法,返回值为8

print '''   这种方式会陷入无限递归
class Try_int(int):
    def __add__(self, other):
        return self + other
    def __sub__(self, other):
        return self - other
'''
class Try_int(int):
    def __add__(self, other):
        return int(self) + int(other)   # 只有经过强制类型转换才不会陷入递归的漩涡
    def __sub__(self, other):
        return int(self) - int(other)

a = Try_int(3)
b = Try_int(5)
print a + b
print a - b

# 知道魔法方法的好处就是可以修改其魔法方法以实现不同的功能,使得程序更灵活
class int(int):
    def __add__(self, other):
        return int.__sub__(self,other)

a = int('5')
print a       # 5
b = int(3)
print a + b   # 2

print("=================================================")
# 反运算符
class Nint(int):
    def __radd__(self, other):
        return int.__sub__(self,other)
a = Nint(5)
b = Nint(3)
print a + b   # 8
print 1 + b   # 3-1=2 b是主动加1,但又调用了int的减法

类的魔法属性访问:

class C:
    def __getattribute__(self,name):   # 访问属性时就被调用
        print("getattribute")
        return super().__getattribute__(name)
    def __getattr__(self,name):        # 访问未知属性才被调用
        print("getattr")
    def __setattr__(self,name,value):  # 设置属性时被调用
        print("setattr")
        super().__setattr__(name,value)
    def __delattr__(self,name):        # 删除属性时被调用
        print("delattr")
        super().__delattr__(name)

c = C()
c.x
c.x = 1
c.x
del c.x
c.x

class Rectangle:
    def __init__(self,width,height):
        self.width = width
        self.height = height
    def __setattr__(self,name,value):
        if name == 'square':
            self.width = value
            self.height = value
        else:
          #  self.name = value   错误的方法,陷入无限递归
          #  super().__setattr__(name,value)  # 方法一
             self.__dict__[name] = value      # 方法二 直接设置属性
    def getArea(self):
        return self.width * self.height

注意:super()需要python3及以上的版本才适用,否则会报错


类的所有魔法方法:

Python 学习(5)---类的相关知识整理(续)_第1张图片

Python 学习(5)---类的相关知识整理(续)_第2张图片

Python 学习(5)---类的相关知识整理(续)_第3张图片

Python 学习(5)---类的相关知识整理(续)_第4张图片

Python 学习(5)---类的相关知识整理(续)_第5张图片

Python 学习(5)---类的相关知识整理(续)_第6张图片

你可能感兴趣的:(python)