Zhonghui

每个不曾起舞的日子,都是对生命的辜负

User Tools

Site Tools


程序:python:面向对象

Python面向对象


子类访问父类

super()指的是父类,Python3中可以不需要带参数
不要这么写:super().__init__(self)
当调用一个类的时候,默认就会有self参数,不需要手动去加,即使是手动调用父类的__init__函数,super.__init__()即可

魔法方法

__init__ #构造函数,在生成对象时调用
__del__ #析构函数,释放对象时使用
__repr__ #打印,转换
__setitem__ #按照索引赋值
__getitem__ #按照索引获取值
__len__ #获得长度
__cmp__ #比较运算
__call__ #调用
__add__ #加运算
__sub__ #减运算
__mul__ #乘运算
__div__ #除运算
__mod__ #求余运算
__pow__ #幂

成员变量保护

以双下划线开头的变量是私有变量,只能类内部访问

内部函数种类

  1. 普通成员函数(第一个参数是self)
  2. @classmethod(第一个参数是cls)
  3. @staticmethod

注意:self和cls都不是python保留关键字,用这两个变量名只是约定俗成(对应函数的第一个参数自动成为self或者cls)

静态成员函数

使用修饰器@staticmethod

示例代码

class Person:
    #构造函数
    def __init__(self):
        print('Construct A Person')
 
    #析构函数
    def __del__(self):
        print('Destroy A Person')
 
    #普通函数都需要self参数 相当于this指针
    def Say(self):
        print('Person Say')
 
    #静态函数用一个修饰器修饰 不需要self参数
    @staticmethod
    def About():
        print('About Person Class')
 
class Student(Person):
    def __init__(self,name:str):
        #手动构造父类
        super().__init__()
        #以双下划线开头的变量是私有变量 只能类内部访问
        self.__name=name
        print('Construct A Student')
 
    def __del__(self):
        print('Destroy A Student')
        #手动析构父类
        return super().__del__()
 
    #覆盖了一个普通函数直接就相当于重写了虚函数
    #Py没有指针引用的概念
    #直接就是根据对象的类型来确定调用哪个版本的函数的
    def Say(self):
        print('My Name is',self.__name)
        #如果需要的话 调用父类的函数
        #return super().Say()
 
#实现多态
def CallSay(SomePerson):
    SomePerson.Say()
 
def main():
    person=Person()
    #传入参数给构造函数
    student=Student('Zhonghui')
 
    #静态函数
    Person.About()
 
    #不能访问私有变量
    #print(student.__name)
 
    CallSay(person)
    CallSay(student)
 
if __name__=='__main__':
    main()
 
#cls和self关键字类似 但是很鸡肋(?)
/var/www/DokuWikiStick/dokuwiki/data/pages/程序/python/面向对象.txt · Last modified: 2024/12/14 04:13 by zhonghui