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及以上的版本才适用,否则会报错
类的所有魔法方法: