当前位置: 首页 > 后端技术 > Python

PythonOOP-1

时间:2023-03-26 10:50:25 Python

0.OOP-Python面向对象Python面向对象编程基础公私继承组合,Mixin魔法函数-魔法函数概述-构造类魔法函数-操作类魔法函数1.面向对象概述(ObjectOriented,OO)OOP思想联系对于任何任务,首先想到的是任务世界的构成,它由几个名词组成OO:面向对象OOA:面向对象分析OOD:面向对象设计OOI:对象-面向实现OOP:面向对象编程OOA->OOD->OOI:面向对象实现过程类和对象概念类:抽象名词,代表一个集合,普通对象:具体事物,单个个体类与对象的关系-具体的,代表一类事物的某一个体——一个是抽象的,代表一大类事物的内容,应该有两个内容来表示特征事物的特性。表示事物的功能或动作的称为属性(变量),称为成员方法(函数)2、类的基本实现。词与词直接相连)尽量避免类似系统命名的命名类的声明方式必须使用class关键字类由属性和方法组成,其他成员不允许使用属性定义,可以直接使用变量赋值,如果没有值,可以使用Nonecase01.pyinstantiatedclassvariable=classname()#实例化一个对象,使用点运算符obj访问对象成员。成员属性名称obj。member方法可以通过默认内置变量objectall成员检查dictobj.__dict__前后各有两个下划线dict的所有成员在class_name.__dect__前后各有两个下划线3.Anaconda基本使用anaconda主要是虚拟环境管理器或者安装包管理器condalist:显示anaconda安装包condaenvlist:显示anaconda的虚拟环境列表condacreate-nxxxpython=3.6:创建一个python版本为3.6的虚拟环境,名称为xxx4。类和对象的成员分析类和对象都可以存储成员,成员可以归为所有,也可以归为所有对象。存储成员时,使用与类关联的对象。对象存储成员存储在当前对象中。访问成员时,如果对象中没有该成员,则尝试访问类中的成员如果对象中有同名成员,则必须使用对象中的成员创建对象,并且班级中的成员将不会被安置进入对象,但是得到一个空对象,没有成员通过对象重新分配类的成员或者通过对象添加成员,对应的成员会保存在对象中,类成员不会被修改5.关于对象中self的方法表示当前对象本身。如果通过对象调用方法,则该对象会自动传入当前方法的第一个参数。self不是关键字,而是接收对象的普通参数。理论上,任何一个普通的变量名将方法中带有self参数的方法替换为未绑定类的方法,可以通过对象访问,而没有self的方法是绑定类的方法,只能通过类访问在使用类访问绑定类的方法时,如果需要在类方法中访问当前类的成员,可以通过__class__成员名访问:publicprotected:protectedprivate:privatepublic,private,protected不是确定对象位置的关键字object内部对象externalsubclasspython中下划线的使用在成员类Person()前面加两条下划线:#name是一个共享成员name="ruochen"#__age是一个私有成员__age=18Python的private并不是真正的私有,它是一个namemanglingrenamestrategy可以使用对象._classname_attributename来访问受保护的封装。受保护的封装就是将对象成员封装到一定的层次。那么,在类中或者子类中都可以访问,但是方法不能对外封装:在成员名前加上下划线就可以公开。publicpublicpublic封装实际上对成员没有任何操作,可以在任何地方访问classStudent():name="aaa"age=18Student.__dict__#Instantiatea=Student()a.__dict__print(a.name)aaaclassA():name="dana"age=18#注意say的写法,参数有selfdefsay(self):self.name="aaa"self.age=200#这个例子表明#类实例的属性和它的对象实例的属性没有赋值给对象的实例属性,#指向同一个变量#此时A被称为类实例print(A.name)print(A.age)print("*"*20)#id可以识别一个变量和另一个变量是否是同一个变量print(id(A.name))print(id(A.age))print("*"*20)a=A()print(a.name)print(a.age)print(id(a.name))print(id(a.age))dana18************************2245155422024140717429003616*********************dana182245155422024140717429003616#此时A被称为类实例print(A.name)print(A.age)print("*"*20)#id可以识别一个变量和另一个变量是否相同print(id(A.name))print(id(A.age))print("*"*20)a=A()#查看A中的所有属性print(A.__dict__)print(a.__dict__)a.name="yaona"a.age=16print(a.__dict__)print(a.name)print(a.age)print(id(a.name))print(id(a.age))dana18*********************2245155422024140717429003616***********************{'__module__':'__main__','name':'dana','age':18,'say':,'__dict__':,'__weakref__':,'__doc__':None}{}{'name':'瑶娜','age':16}yaona162245155597256140717429003552classStudent():name="dana"age=18#注意say的写法,参数有selfdefsay(self):self.name="aaa"self.age=200print("我的名字是{0}".format(self.name))print("我的年龄是{0}".format(self.age))defsayAgain(s):print("我的名字是{0}".format(s.name))print("我的年龄是{0}".format(s.age))yueyue=Student()yueyue.say()yueyue.sayAgain()我的名字是aaa我的年龄是200MynameisaaaMyageis200classTeacher():name="dana"age=19defsay(self):self.name="yaona"self.age=17print("Mynameis{0}".format(self.name))#调用类的成员变量需要使用__class__print("我的年龄是{0}".format(__class__.age))defsayAgain():print(__class__.name)print(__class__.age)print("Hello,nicetoseeyouagain")t=Teacher()t.say()#调用绑定类函数使用类名Teacher.sayAgain()我叫yaonaMy年龄是19dana19你好,很高兴再次见到你#关于self的案例A():name="ruochen"age=18def__init__(self):self.name="aaaa"self.age=200defsay(self):print(self.name)print(self.age)classB():name="bbb"age=99a=A()#此时系统默认会将a作为第一个参数传递给函数a.say()#此时self被替换为一个A.say(a)#也可以将A作为参数传入A.say(A)#此时传入的是类实例B,因为B有name和age属性,都不会报错A.say(B)#上面代码使用了duck模型aaaa200aaaa200ruochen18bbb99#私有变量caseclassPerson():#name是普通成员name="ruochen"#__age是aprivatemember__age=18p=Person()#nameisapublicvariableprint(p.name)#__ageisaprivatevariable#注意报错信息print(p.__age)ruochen------------------------------------------------------------------------AttributeErrorTraceback(mostrecentcalllast)in11#__age是私有变量12#注意错误信息--->13print(p.__age)AttributeError:'Person'objecthasnoattribute'__age'#name.mangling技术print(Person.__dict__)p._Person__age=19print(p._Person__age){'__module__':'__main__','name':'若琛','_Person__age':18,'__dict__':<“人”对象的属性“__dict__”>,“__weakref__”:<“人”对象的属性“__weakref__”>,“__doc__”:无}19