Python编程用法——Python类

本文介绍了Python编程中的类,包括构造函数__init__、私有函数、继承、运算符重载和比较运算符重载。类的__name__属性不可直接修改,需要通过特定方式。Python支持多态,子类可以继承并重载基类的公有函数和成员变量,而私有函数和变量不受影响。此外,还讨论了如何进行类的继承关系判断和运算符的重载实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值