|
Python类1、面向对象:根据类来创建对象称为实例化,这让你能够使用类的实例。面向对象编程(Object-orientedProgramming,简称OOP),是一种封装代码的方法。代码封装,其实就是隐藏实现功能的具体代码,仅留给用户使用的接口,就好像使用计算机,用户只需要使用键盘、鼠标就可以实现一些功能,而根本不需要知道其内部是如何工作的。在Python中,所有的变量其实也都是对象,包括整形(int)、浮点型(float)、字符串(str)、列表(list)、元组(tuple)、字典(dict)和集合(set)。面向对象中,常用术语包括:**类:可以理解是一个模板,通过它可以创建出无数个具体实例。**比如,前面编写的tortoise表示的只是乌龟这个物种,通过它可以创建出无数个实例来代表各种不同特征的乌龟(这一过程又称为类的实例化)。**对象:类并不能直接使用,通过类创建出的实例(又称对象)才能使用。**这有点像汽车图纸和汽车的关系,图纸本身(类)并不能为人们使用,通过图纸创建出的一辆辆车(对象)才能使用。**属性:类中的所有变量称为属性。**例如,tortoise这个类中,bodyColor、footNum、weight、hasShell都是这个类拥有的属性。**方法:类中的所有函数通常称为方法。**不过,和函数所有不同的是,类方法至少要包含一个self参数(后续会做详细介绍)。例如,tortoise类中,crawl()、eat()、sleep()、protect()都是这个类所拥有的方法,类方法无法单独使用,只能和类的对象一起使用。2、定义类:类的使用顺序:创建(定义)类。创建类的实例对象,通过实例对象实现特定的功能。语法:class类名:多个(≥0)类属性...多个(≥0)类方法...123注意:无论类属性还是类方法,都不是必须的,还有就是类属性和类方法的位置是任意的,没有固定的先后顺序。但一般都是属性在前,方法在后。classTheFirstDemo():"""第一个python类"""#定义类属性:name="萧楚河"#定义say类方法:defsay(self,content):print(content)12345678'运行运行注意:定义在类里面的属性称为类属性,定义在类方法中的属性称为实例属性。3、__init__()类构造方法:构造方法用于创建对象时使用,每当创建一个类的实例对象时,Python解释器都会自动调用它。语法:def__init__(self,...):代码块12classTheFirstDemo():"""第一个python类"""#定义类属性:name="萧楚河"#定义构造方法:def__init__(self):print("调用构造方法")#定义say类方法:defsay(self,content):print(content)123456789101112'运行运行4、创建和使用类:classinitDemo():"""构造方法练习"""name='jack'#构造方法:def__init__(self,school,age):print(f"学校名字是:{school},今年{age}岁了。")#定义say方法defsay(self):print("我是say方法。")pp2=initDemo("师范附中",21)#学校名字是:师范附中,今年21岁了。pp2.say()#我是say方法。1234567891011121314'运行运行在创建对象时,隐式的调用__init()__方法。并且里面的self不需要传参。定义的类只有进行实例化,也就是使用该类创建对象之后,才能得到利用。访问或修改类对象具有的实例变量,甚至可以添加新的实例变量或者删除已有的实例变量;调用类对象的方法,包括调用现有的方法,以及给类对象动态添加方法。#类的使用classCstady():"""类对象的使用"""name='tom'age=21#say方法:defsay(self,content):print(content)cc=Cstady()print(f"姓名为:{cc.name},年龄:{cc.age}")#姓名为:tom,年龄:21cc.say("我怎么这么帅")#我怎么这么帅cc.name='萧楚河'print(cc.name)#萧楚河cc.email='12345@qq.com'print(cc.email)#12345@qq.com#给类对象动态添加变量。#动态删除实例变量:delcc.emailprint(cc.email)#AttributeError:'Cstady'objecthasnoattribute'email'12345678910111213141516171819202122235、self的用法:无论是显式创建类的构造方法,还是向类中添加实例方法,都要求将self参数作为方法的第一个参数。Python只是规定,无论是构造方法还是实例方法,最少要包含一个参数,并没有规定该参数的具体名称。之所以将其命名为self,只是程序员之间约定俗成的一种习惯,遵守这个约定,可以使我们编写的代码具有更好的可读性。通过self参数,它就相当于每个房子的门钥匙,可以保证每个房子的主人仅能进入自己的房子(每个类对象只能调用自己的类变量和类方法)。同一个类可以产生多个对象,当某个对象调用类方法时,该对象会把自身的引用作为第一个参数自动传给该方法,换句话说,Python会自动绑定类方法的第一个参数指向调用该方法的对象。#self的使用classSlee():"""self详解"""def__init__(self):print("调用构造函数")defsay(self):print(self,"学习self的作用。")lili=Slee()lili.say()#学习self的作用。xiaom=Slee()xiaom.say()#学习self的作用。1234567891011121314'运行运行对于构造函数中的self参数,其代表的是当前正在初始化的类对象。classPerson():"""定义一个person类"""name="xxxx"def__init__(self,name):self.name=namepp=Person('tom猫')print(pp.name)#tom猫123456789'运行运行6、类变量和实例变量:类体中、所有函数之外:此范围定义的变量,称为类属性或类变量;类体中,所有函数内部:以“self.变量名”的方式定义的变量,称为实例属性或实例变量;类体中,所有函数内部:以“变量名=变量值”的方式定义的变量,称为局部变量。和类变量不同,通过某个对象修改实例变量的值,不会影响类的其它实例化对象,更不会影响同名的类变量。classPerson():"""person类"""name='小明'url='www.baidu.com'def__init__(self):self.name='linux'self.url='hello,linux'defsay(self):self.age=13#实例对象1p01=Person()p01.name='java'p01.url='javaisverygood.'print(p01.name,p01.url)#实例对象2p02=Person()print(p02.name,p02.url)#类变量print(Person.name)print(Person.url)12345678910111213141516171819202122'运行运行Python只支持为特定的对象添加实例变量。通常情况下,定义局部变量是为了所在类方法功能的实现。需要注意的一点是,局部变量只能用于所在函数中,函数执行完成后,局部变量也会被销毁。classSum():"""求和类"""defsum(self,num):s=0.8*numprint(f"价格为:{s}")ss=Sum()ss.sum(10)#812345678'运行运行7、实例方法、静态方法和类方法:采用@classmethod修饰的方法为类方法;采用@staticmethod修饰的方法为静态方法;不用任何修改的方法为实例方法。构造方法也是一种实例方法。其中@classmethod和@staticmethod都是函数装饰器。实例方法:classPerson():"""实例方法"""def__init__(self):print("构造方法。")defsay(self):print("实例方法。")pp=Person()pp.say()123456789'运行运行类方法:classPerson():"""实例方法"""def__init__(self):print("构造方法。")#实例方法defsay(self):print("实例方法。")#类方法@classmethoddefinfo(cls):print("正在调用类方法。")pp=Person()pp.say()pp.info()Person.info()#正在调用类方法。(推荐)123456789101112131415161718'运行运行类方法推荐使用类名直接调用,当然也可以使用实例对象来调用(不推荐)。静态方法:静态方法,其实就是我们学过的函数,和函数唯一的区别是,静态方法定义在类这个空间中,而函数则定义在程序所在的空间中。静态方法没有类似self、cls这样的特殊参数,因此Python解释器不会对它包含的参数做任何类或对象的绑定。也正因为如此,类的静态方法中无法调用任何类属性和类方法。#静态方法:@staticmethoddefshow(name,age):print(f"姓名是:{name},年龄是:{age}")Person.show('小明',21)#姓名是:小明,年龄是:21pp.show('小红',19)#姓名是:小红,年龄是:191234567用类的实例对象访问类成员的方式称为绑定方法,而用类名调用类成员的方式称为非绑定方法。8、类特殊方法:1、repr()方法:显示属性:通常情况下,直接输出某个实例化对象。classCLanguage:passclangs=CLanguage()print(clangs)#1234'运行运行如果想输出该对象的基本信息,例如该对象有哪些属性,它们的值各是多少等等。classCLanguage:def__init__(self):self.name="C语言中文网"self.add="http://c.biancheng.net"def__repr__(self):return"CLanguage[name="+self.name+",add="+self.add+"]"clangs=CLanguage()print(clangs)#CLanguage[name=C语言中文网,add=http://c.biancheng.net]12345678'运行运行repr()方法是类的实例化对象用来做“自我介绍”的方法,默认情况下,它会返回当前对象的“类名+objectat+内存地址”,而如果对该方法进行重写,可以为其制作自定义的自我描述信息。2、del()方法:销毁对象:如果之前创建的类实例化对象后续不再使用,最好在适当位置手动将其销毁,释放其占用的内存空间(整个过程称为垃圾回收(简称GC))。大多数情况下,Python开发者不需要手动进行垃圾回收,因为Python有自动的垃圾回收机制(下面会讲),能自动将不需要使用的实例对象进行销毁。classCLanguage:def__init__(self):print("调用__init__()方法构造对象")def__del__(self):print("调用__del__()销毁对象,释放其空间")clangs=CLanguage()delclangs1234567'运行运行3、dir()用法:列出对象的所有属性(方法)名:dir()函数,可以列出某个对象拥有的所有的属性名和方法名,该函数会返回一个包含有所有属性名和方法名的有序列表。#__dir__()方法的用法classPerson:def__init__(self,):self.name="C语言中文网"self.add="http://c.biancheng.net"defsay(self):passpp=Person()print(dir(pp))['__class__','__delattr__','__dict__','__dir__','__doc__','__eq__','__format__','__ge__','__getattribute__','__gt__','__hash__','__init__','__init_subclass__','__le__','__lt__','__module__','__ne__','__new__','__reduce__','__reduce_ex__','__repr__','__setattr__','__sizeof__','__str__','__subclasshook__','__weakref__','add','name','say']123456789101112'运行运行注意:通过dir()函数,不仅仅输出本类中新添加的属性名和方法(最后3个),还会输出从父类(这里为object类)继承得到的属性名和方法名。dir()函数的内部实现,其实是在调用参数对象dir()方法的基础上,对该方法返回的属性名和方法名做了排序。4、__dict__属性:查看对象内部所有属性名和属性值组成的字典:#__dict__()方法classPerson():a=1b=2def__init__(self):self.name='萧楚河'self.age=21print(Person.__dict__)pp=Person()print(pp.__dict__){'__module__':'__main__','a':1,'b':2,'__init__':,'__dict__':
|
|