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

#小手一扬学设计#比找女朋友还难的技术点之一,Python是面向对象的【附源码】

时间:2023-03-25 20:08:24 Python

有人在Python学习过程中一直没搞明白的技术之一职业:面向对象。PythonObject-OrientedProgrammingPython恰恰是一种面向对象的编程语言,简称OOP。我们已经知道Python中的所有数据类型都是对象。除了Python设置外,Python还允许程序开发人员定义自己的数据。类型,这个由程序员定义的数据类型就是一个类。面向对象初学者有门槛,学习请谨慎。类定义及使用类定义语法格式如下:classMyClass():codeblock...代码块类名首字母建议大写,如语法格式中的MyClass。定义类、属性和方法类包含属性和方法。接下来,我们定义一个“人”类。#定义人类类Person():#类属性名="Didi"#类方法deftalk(self):print("sayhello")上面代码中,Person为类名,在该类中定义了一个属性和一个方法。类内部定义的方法和函数很相似,但是注意类内部定义的函数不能再叫函数了(是不是开始绕了),应该叫方法,因为只有对象的该类可以调用该方法。在定义方法时,注意有一个参数叫做self。请记住,这是一种固定的书写方式。在类内部的所有方法参数中,必须写关键字self。调用属性和方法在调用属性和方法之前,必须先定义一个类对象。具体方法如下。此操作也称为实例化。类的实例化操作之后,出现一个对象。Object=classname()比如刚才定义了一个human,使用下面的代码就可以得到一个human对象。#定义对象xiang=Person()定义完对象后,就可以使用属性和方法了。classPerson():#类属性名="滴滴"#类方法deftalk(self):print("sayhello")xiang=Person()#输出对象print(xiang)#输出对象属性print(xiang.name)#输出对象方法xiang.talk()代码运行后输出如下内容。<__main__.Personobjectat0x000002465F364B70>滴滴sayhello代码中的变量xiang是Person类的对象,通过xiang对象可以读取Person类中的name属性和talk方法。如果该类还有其他属性和方法,也可以用同样的方法实现。类的构造函数的难度提高了一点。在创建类的时候,希望输入一些初始数据,也就是对类进行初始化。内容是在类内部写一个方法。这种方法是一种特殊的方法。定义类的Objects在编程过程中会自动执行该方法。初始化方法名固定为__init__,在init的左右各有两条下划线。类的初始化方法叫构造函数(刚才说类叫方法,我叫它函数,是不是很迷惑?真的没办法这样,大家都这么叫)。接下来写一段代码,在定义一个类的对象时,默认给Person类的属性名赋值。classPerson():#类属性名="滴滴"#构造函数def__init__(self,in_name):self.name=in_name#类方法deftalk(self):print("sayhello")xiang=Person('teacher')#输出对象print(xiang)#输出对象属性print(xiang.name)#输出对象方法xiang.talk()上面的代码做了一些简单的改动,首先添加了__init__构造函数,注意有两个参数构造函数,一个是self,在类内部定义函数时是必须的,需要放在参数的最左边,Python在定义类self的对象时会自动传入这个参数。self代表的类本身的对象。构造函数中还有一个参数in_name。如果设计了构造函数,除了self之外还有其他参数,那么在定义Person对象时,必须传递这个参数。传入的参数可以通过self.name属性修改对象的名称。至少可以说是令人困惑,但这很简单。每次我们使用一个类来定义一个对象,例如下面的代码:obj1=Person()obj2=Person()上面定义了两个对象,这两个对象都是基于类Person定义的。self参数指示它在类中是哪个对象。如果你还是不明白,没关系,只要记住下面的话就可以了。声明了类之后,就相当于自己定义了一个数据类型。你可以使用这个数据类型的变量,但是因为面向对象的概念,这个变量被称为对象,对象可以调用类的属性和方法。一个类对应多个对象,如何判断是哪个对象在调用类内部的属性或方法,需要用到的就是参数self。属性初值在这部分之前,在类内部设置一个初值,使用name="滴滴"来完成。学习了构造函数后,你应该知道在Python中初始化数据时,通常是放在__init__方法中。classPerson():#constructordef__init__(self,in_name,in_age):#属性初始化self.name=in_nameself.age=in_age#classmethoddeftalk(self):#类中的属性,在初始化中即可thencallprint(self.name)print("sayhello")defshow_age(self):#通过self.age调用初始化的ageprint(self.age)xiang=Person('teacher',19)#输出对象print(xiang)#输出对象属性print(xiang.name)#输出对象方法xiang.talk()封装接下来要学习的是面向对象的三个基本特性之一,封装。封装简单理解,先不深究,理解概念,理解概念。我们刚才使用的属性和方法,可以通过对象在类外访问。这些称为公共属性和公共方法,但有时类内部的属性和方法不想被外部对象修改,需要引入私有属性和私有方法。概念,这个概念的引入导致了封装概念的出现。封装就是把类里面的东西密封起来,不叫你随便用(其实是有办法调用的)。私有属性在类中定义私有属性非常简单。这是一种写作技巧。只需要在属性前加上两个下划线,即__name。例如,将秘密变量定义为人类的私有属性。classPerson():#构造函数def__init__(self,in_name,in_age):#属性的初始化self.name=in_nameself.age=in_ageself.__secret="Ihavecodecleanliness"#私有属性#类方法deftalk(self):#类中的方法可以访问私有属性print(self.__secret)print("sayhello")defshow_age(self):print(self.age)xiang=Person('teacher',19)#尝试输出对象的私有属性print(xiang.__secret)#Error#尝试通过类的方法输出私有属性xiang.talk()在类内部初始化私有属性后,发现不能通过对象调用私有属性。属性名,但类内部可以使用私有属性,这种操作称为封装属性。如果私有方法具有私有属性,则必须有私有方法。如果两种形式相同,则在方法前加两个下划线,即为私有方法。classPerson():#构造函数def__init__(self,in_name,in_age):#属性的初始化self.name=in_nameself.age=in_ageself.__secret="Ihavecodecleanliness"#私有属性#类方法deftalk(self):#类中的方法可以访问私有属性print(self.__secret)print("sayhello")#类的私有方法def__show_age(self):print(self.age)xiang=Person('teacher',19)#尝试输出对象的私有属性#print(xiang.__secret)#报错#尝试通过类的方法输出私有属性xiang.__show_age()#报错Pay注意错误的内容,能记住就记住,熟练查找代码错误的前提是遇到足够多的代码错误。继承在学习继承的概念之前,需要学习几个新词。首先,类可以被继承。被继承的类称为父类或基类,被继承的类称为子类或派生类。使用类继承的最大好处是父类实现的公共属性或方法不需要在子类中重新设计。内容也比较扑朔迷离,先看看语法格式吧。#定义一个父类classBaseClassName():父类的代码块classChildClassName(BaseClassName):子类的代码块继承类时,把父类的名字放在括号中。一个简单的继承应用声明了一个动物类,然后让狗类继承动物类。动物类有一个名为name的公共属性和一个名为sleep的公共方法。#定义Animal类classAnimal():def__init__(self):self.name="Animalname"defsleep(self):print("Animalswillsleep")#Dog类继承自Animal类classDog(Animal):passdog=Dog()print(dog.name)dog.sleep()上面代码中的Dog类没有任何属性和方法,只是继承了Animal类,具有的公共属性和公共方法动物类。在这种继承方式中,子类不能直接读取父类的私有属性或方法,即下面的代码是错误的。#定义Animal类classAnimal():def__init__(self):self.name="AnimalName"self.__secret="Secret"defsleep(self):print("Animalswillsleep")#Dog类继承自Animal类classDog(Animal):passdog=Dog()print(dog.__secret)dog.sleep()子类具有与父类同名的属性或方法。在编程时,子类也可以有自己的初始化方法,即__init__方法。在这种情况下,子类中的属性名和方法名可能与父类中的属性名和方法名相同。这时候请关注子类中的属性值或者方法。#定义Animal类classAnimal():def__init__(self):self.name="AnimalName"self.__secret="Secret"defsleep(self):print("Animalswillsleep")#Dog类继承自动物类classDog(Animal):def__init__(self):self.name="dog"defsleep(self):print("dogwillsleep")#objectoftheparentclassanimal=Animal()animal.sleep()#子类的对象dog=Dog()dog.sleep()内容展开的话,就是面向对象的三大特性中的最后一个——多态性。子类使用父类的方法。super函数可以用来在子类中调用父类的方法。具体代码如下:#定义Animal类classAnimal():def__init__(self,a_name):self.name=a_nameself.__secret="Secret"defsleep(self):print("Animalswillsleep")defshow(self):print("Thenamepassedinnowis"+self.name)#Dog类继承自Animal类classDog(Animal):def__init__(self,a_name):#调用普通方法父类对象的#super().sleep()super().__init__("动物名"+a_name)#父类对象animal=Animal("normalAnimal")animal.show()#子类对象dog=Dog("bigdog")dog.show()在Dog类的构造函数中通过super().__init__("动物名"+a_name)修改传递给父类的参数,这个方案相当于生成一个通过super函数获取父类的对象,然后调用父类的__init__方法实现父类的初始化操作。多态简单理解就是父类和子类有相同的方法,父类和子类创建的对象调用相同的方法名产生不同的结果。更多时候多态是指程序会根据对象自动调用指定的方法。内容的具体代码实现如下:首先定义一个函数,只需要一个参数。defgogo(obj):obj.say()这个函数的参数可以是任何数据类型的对象,然后定义两个类,这两个类都必须有say方法。classDog():defsay(self):print("Wow,woof")classCat():defsay(self):print("喵喵喵")#传入这个函数会判断是否调用对象哪个方法。defgogo(obj):obj.say()#通过Dog定义一个对象dog=Dog()#通过Cat定义一个对象cat=Cat()#在gogo函数中传递dog对象gogo(dog)#在gogo中函数传递猫对象gogo(cat)上面的代码会在传递给函数体的对象被替换时输出不同的数据。这种编码形式或者说编码的设计思想是多态性的一种体现。简单理解就是同一个方法,由于对象不同,实现内容也不同。多重继承上面的解释都是关于单继承的。在实际编码中,经常会用到多重继承,即一个类继承多个父类。语法结构如下:类子类名(父类1,父类2,父类3...):类的代码块内容不再展开解释。在多重继承的情况下,记住一句话就可以了。写在前面的父类比写在后面的父类有更高的优先级。也就是说如果同一个方法出现在父类中,那么子类会优先使用之前的父类,也就是上面语法格式中的父类1。判断一个对象的数据类型类型函数可以用来判断一个对象的数据类型,比如下面的代码:classDog():defsay(self):print("Wowwoof")classCat():defsay(self):print("喵喵喵")#通过Dog定义一个对象dog=Dog()#通过Cat定义一个对象cat=Cat()print(type(dog))print(type(cat))输出为:type可以得到对象的源类。isinstance函数isinstance函数可以判断一个对象是否属于某个类。语法格式如下:isinstance(object,class)#如果对象是从类中实例化的,则返回True,否则返回False这个函数可以判断一个对象是否是从父类中实例化的。#父类Animal():pass#子类Dog(Animal):defsay(self):print("Wow,woof")#子类Cat(Animal):defsay(self):print("喵喵")#通过Dog定义一个对象dog=Dog()#通过Cat定义一个对象cat=Cat()print(isinstance(dog,Dog))#Trueprint(isinstance(dog,Animal))#Trueprint(isinstance(cat,Animal))#真正的特殊属性和方法在之前的课程中,使用dir函数作用于一个对象,会得到如下内容。这个内容里面有很多__XXXX__的内容,是一个对象中特殊的属性和方法。这里有一些。__doc__获取文档字符串如果在类中声明了文档字符串,就是在类的开头定义了一些用“””三引号引起来的内容,比如下面的代码:classAnimal():""""I是文档字符串,相当于一个类的描述部分,其实我有一个标准格式的橡皮擦,第一次滚雪球的时候,就是不想写"""passanimal=Animal()print(animal.__doc__)__name__attribute这里有一个思路问题是自己查一下__name__属性是干什么的。如果你理解了,以后看到下面的代码就不会问为什么了。if__name__=='__main__':执行代码中一些特殊的方法部分,第一次滚雪球的时候不需要好好学习。军衔还没到。学习和不学习是一样的。如果你觉得一定要学习,恰好是一个求知的机会,这时候学习就会事半功倍。想学的可以自己找资料。关键字是__str__()、__repr__()、__iter__()。这篇博客的总结是面向对象的。对于编程初学者来说,学这个东西和不学一样。你一定要坚信,第一次学的时候不仅你不能完全掌握,而且99%的人都是一样的。Persist没错,首先,知道Python有类和对象就够了。时间是学习的最大武器。签到签到,每天学一点点,3个月后见。最后一碗毒鸡汤前女友跟我分手的原因有两个。一是我当时没钱,二是她猜我以后没钱。O(∩\_∩)O哈哈~