Python类内部函数第一个参数永远是self,与C++ this类似,指向自身。
__init__函数是构造函数,通过传参初始化。类成员函数前面加__为私有函数,外部不能改变其值。
类内的函数不能重载
class CTest(object):
def __init__(self,name = "Python",num = 3):`在这里插入代码片`
self.__name = name
self.__num = num
def show(self):
print("name:",self.__name,"num:",self.__num)
def __add(self):
self.num += 1
print("num++:",self.num)
Test1 = CTest()
Test1.show()
Test2 = CTest("Class",5)
Test2.__name = "Modle"
Test2.num = 10
Test2.show()
Test2._CTest__name = "Modle"
Test2.show()
Test2._CTest__add()
执行结果
name: Python num: 3
name: Class num: 10
name: Modle num: 10
num++: 11
类将__name转化为_CTest__name,因此修改的__name没有修改到类的__name值。如果需要强行修改__name的值,就必须修改_CTest__name才行。
同理,若想访问私有函数,就必须调用_CTest__add,否则会出错,因为类没有__add函数。
但按照编程语言规则,私有的变量不可改变,因此不能强行修改私有变量
继承
Python的类能够继承,继承的函数能够实现多态功能。
基类被子类继承后,公有的函数和成员变量都会被重载,私有函数和变量不受影响。
#基类1
class CBase(object):
def __init__(self,name = "Base",num = 2):
self.__name = name
self.num = num
def __showName(self,callname):
#被继承之后self属于之类
print("base name:",self.__class__.__name__)
print("call name:",callname)
def show(self):
print("base name:",self.__name,"num:",self.num)
print("base class name:",self.__class__.__name__)
#基类2
class CBaaeShow(object):
def __init__(self,name = "Base Show",num = 2):
self.__name = name
self.__num = num
def baseshow(self):
print("base show name:",self.__name,"num:",self.__num)
#类的继承与多重继承
class CObj(CBase,CBaaeShow):
def __init__(self,name = "Python",num = 3):
#基类初始化
CBase.__init__(self,"set Base",5)
CBaaeShow.__init__(self)
self.__name = name
self.num = num
def __showName(self,callname):
#被继承之后self属于之类
print("Obj name:",self.__class__.__name__)
print("call name:",callname)
#类重载
def show(self):
print("name:",self.__name,"num:",self.num)
self.__showName(self.__class__.__name__)
#访问基类函数
CBase.show(self)
CBaaeShow.baseshow(self)
#不推荐强制访问私有函数
CBase._CBase__showName(self,self.__class__.__name__)
Test1 = CObj("set Python",7)
Test1.show()
执行结果
name: set Python num: 7
#子类__showName
Obj name: CObj
call name: CObj
#基类show
base name: set Base num: 7
base class name: CObj
#基类__showName
base name: CObj
call name: CObj
#子类show
name: set Python num: 7
Obj name: CObj
call name: CObj
#基类show
base name: set Base num: 7 #__name没有被子类覆盖,但num被子类覆盖
base class name: CObj
base show name: Base Show num: 2
#基类__showName
base name: CObj #self.__class__.__name__由传进来的self决定
call name: CObj
类变量
判断类的继承关系
在变量一节提到,用过函数isinstance获取类的继承关系
Test1 = CObj("set Python",7)
print("is CObj:",isinstance(Test1,CObj))
print("is CBase:",isinstance(Test1,CBase))
执行结果
is CObj: True
is CBase: True
派生
在变量一节提到,用过函数isinstance获取类的继承关系
Test1 = CBase("set Base",2)
Test2 = CObj("set Obj",3)
def showFunc(f):
f.show()
showFunc(Test1)
showFunc(Test2)
执行结果
```python
#Test1基类的show
base name: set Base num: 2
base class name: CBase
#Test2子类的show
name: set Obj num: 3
Obj name: CObj
call name: CObj
base name: set Base num: 3
base class name: CObj
base name: CObj
call name: CObj
运算符重载
Python支持运输符重载,对相应的内置函数运算符两侧添加__
class CTest(object):
def __init__(self,name = "Python",num = 3):
self.__name = name
self.num = num
def show(self):
print("name:",self.__name,"num:",self.num)
def __add__(self,value):
#判断类型
if (not isinstance(value,CTest)):
raise TypeError("value is not CTest")
return CTest("Class add",self.num + value.num)
#重载 -
def __sub__(self,value):
return CTest("Class sub",self.num - value.num)
#重载 *
def __mul__(self,value):
return CTest("Class mul",self.num * value.num)
#重载 /
def __truediv__(self,value):
return CTest("Class truediv",self.num / value.num)
#重载 //
def __floordiv__(self,value):
return CTest("Class floordiv",self.num // value.num)
#重载 %
def __mod__(self,value):
return CTest("Class mod",self.num % value.num)
Test1 = CTest("Class1",2)
Test2 = CTest("Class2",3)
Test3 = Test1 + Test2
Test3.show()
Test3 = Test1 - Test2
Test3.show()
Test3 = Test1 * Test2
Test3.show()
Test3 = Test1 / Test2
Test3.show()
Test3 = Test1 // Test2
Test3.show()
Test3 = Test1 % Test2
Test3.show()
执行结果
name: Class add num: 5
name: Class sub num: -1
name: Class mul num: 6
name: Class truediv num: 0.6666666666666666
name: Class floordiv num: 0
name: Class mod num: 2
比较运算符重载
class CTest(object):
def __init__(self,name = "Python",num = 3):
self.__name = name
self.num = num
def show(self):
print("name:",self.__name,"num:",self.num)
#重载 <
def __lt__(self,other):
return self.num < other.num
#重载 <=
def __le__(self,other):
return self.num <= other.num
#重载 >
def __gt__(self,other):
return self.num > other.num
#重载 >=
def __ge__(self,other):
return self.num >= other.num
#重载 ==
def __eq__(self,other):
return self.num == other.num
#重载 !=
def __ne__(self,other):
return self.num != other.num
#通过函数调用
print("func Class <:",Test1.__lt__(Test2))
print("Class <:",Test1 < Test2)
print("Class <=:",Test1 <= Test2)
print("Class >:",Test1 > Test2)
print("Class >=:",Test1 >= Test2)
print("Class ==:",Test1 == Test2)
print("Class !=:",Test1 != Test2)
执行结果
func Class <: True
Class <: True
Class <=: True
Class >: False
Class >=: False
Class ==: False
Class !=: True
枚举类
Python实现枚举功能是通过类的形式实现的。定义后枚举值默认从1起始,也可以自定义。
枚举值需要包含对应模块
from enum import Enum
from enum import Enum
enumType = Enum("Python",("ONE", "TWO", "THREE"))
#获取枚举值
print(enumType)
print(enumType.ONE)
print(enumType['TWO'])
print(enumType(3))
print("get",enumType(3).name,"number name:","value:",enumType(3).value)
#遍历获取枚举值
for name, member in enumType.__members__.items():
print("name:",name,"---number name:", member,"---value:", member.value)
#自定义枚举值
class Cenum(Enum):
STEP1 = 5
STEP2 = 7
STEP3 = 11
for name, member in Cenum.__members__.items():
print("name:",name,"---number name:", member,"---value:", member.value)
执行结果
<enum 'Python'>
Python.ONE
Python.TWO
Python.THREE
get THREE number name: value: 3
name: ONE ---number name: Python.ONE ---value: 1
name: TWO ---number name: Python.TWO ---value: 2
name: THREE ---number name: Python.THREE ---value: 3
name: STEP1 ---number name: Cenum.STEP1 ---value: 5
name: STEP2 ---number name: Cenum.STEP2 ---value: 7
name: STEP3 ---number name: Cenum.STEP3 ---value: 11