Python学习之面向对象编程详解
什么是面向对象编程(类)利用面向对象的属性和方法去进行编码的过程即面向对象编程自定义对象数据类型就是面向对象中的类(class)的概念类的关键字 - classclass 关键字用来声明类类的名称首字母大写多单词的情况下每个单词首字母大写(即驼峰命名法)。在我们一开始学习 Python 的时候说过要尽量避免使用 驼峰命名法 但 类 的命名是一个特例类 的命名可以使用驼峰命名。类的定义与使用类的定义示例如下1234567891011classNmae(object):# class关键字 类名(首字母大写) 小括号(括号内填写 object:为python中的通用对象书写通用对象的 class 会带有更多的内置功能) 冒号变量变量的值# 可以定义 类 的变量deffunc(self):do# 也可以定义 类 的函数类函数内有个必传参数 self 一定要书写在类函数的第一参数位这是 python 内部的语法规定# 需要注意的是 类的属性与函数的缩进要统一类的使用示例如下1234567891011121314151617181920# 定义一个动物类动物类中定义一个变量定义一个 跑 的函数(属性)classAnimal(object):# 定义一个类name哈士奇# 类变量(类属性)defrun(self):# 类函数将 self 作为第一个参数传入 类函数 run()print(f{self.name} can run)# self.name为类属性如果不加上self.则不会找到类属性如果想要在类函数中调用类属性就必须加上self.# self 参数具备两个功能# 1.可以帮助我们调用类属性# 2.将使用 self 的函数调用到类中如果我们有另一个函数可以在另一个函数中通过 self. 来进行调用 run 函数dogAnimal()# 类的实例化print(dog.name)# 通过实例化进行属性调用dog.run()# 通过实例化进行函数调用# 执行结果如下# 哈士奇# 哈士奇 can run类的参数 - self在类里面所有实例方法都需要加 self 参数且排在第一个有且仅有一个。self 参数的含义 在类中定义的方法第一个参数 self 指向调用该方法的实例对象在方法中通过 self.属性 这样的形式访问对象的实例属性self 是 类函数 中的必传参数且必须放在第一个参数位置self 是一个对象它代表着实例化的变量自身self 可以直接通过点(.)来定义一个类变量 如 self.name Neo 如果在函数体内定义变量可以通过 self . 变量名 来进行赋值。self 中的变量与含有 self参数的函数可以在类中的任何一个函数内随意调用非函数中定义的变量在定时的时候不需要使用 self如何理解 self 参数类比如果把 类 比作造房子的图纸类实例化 后的对象是真正可以住的房子根据一张图纸类可以设计出成千上万的房子实例对象每个房子长相都是类似的都有相同的实例属性和实例方法但它们都有各自的主人如何区分不同的房子通过 self 参数可以保证每个房子的主任仅能进入自己的房子每个实例对象只能调用自己的实例属性和实例方法重点一个类可以产生多个实例对象当某个实例对象调用实例方法该对象会把自身的引用作为第一个参数自动传递给该方法换句话说Python 会自动将实例方法的第一个参数指向调用该方法的对象这样Python 解释器就知道到底要执行哪个对象的实例方法了调用实例方法的时候不需要手动为第一个参数传值可能大家还不是很理解根据类的两个关键要素属性和方法具体来使用self看看实际应用效果1234567891011121314151617classPersion(object):nameNoneageNonedefrun(self):print(f{self.name} 的健身项目是\跑步\)defswim(self):print(f{self.name} 的健身项目是\游泳\)neoPersion()neo.nameNeoneo.run()# 执行结果如下# Neo 的健身项目是跑步我们再重新实例化一个对象看看这个新的实例化对象是否同步了 neo.name12345678910111213141516171819202122classPersion(object):nameNoneageNonedefrun(self):print(f{self.name} 的健身项目是\跑步\)defswim(self):print(f{self.name} 的健身项目是\游泳\)neoPersion()neo.nameNeoneo.run()jackPersion()jack.run()# 执行结果如下# Neo 的健身项目是跑步# None 的健身项目是跑步从输出结果可以看到 我们修改的 neo 实例化对象的对应的 name 的值仅作用于自己的实例而 Persion 类与新的 jack 实例化对象并没有受到影响。所以即使使用新的对象进行实例化还是需要新的实例化对象来修改类的属性来达到我们自己想要的效果。其实很好理解都是人类但是每个人的个体化都是不同的。所以他们拥有人类的共同属性后 (nameage) 也可以自定义自己的属性。现在我们的 Persion 类 定义了两个属性 name 与 age 如果我们再添加一个属性呢 其实是可以的。现在我们针对 Jack 增加一个自定义属性 尝试一下。12345678910111213141516171819202122232425262728classPersion(object):nameNoneageNonedefrun(self):print(f{self.name} 的健身项目是\跑步\)defswim(self):print(f{self.name} 的健身项目是\游泳\)neoPersion()neo.nameNeoneo.run()jackPersion()jack.top180print(\Jack\的身高是, jack.top)# 执行结果如下# Neo 的健身项目是跑步# Jack的身高是 180print(\Neo\的身高是, neo.top)# 执行结果如下# AttributeError: Persion object has no attribute top从上面的 jack.top 与 neo.top 的自定义属性我们发现三件事。1.实例化对象可以自定义属性2.每个实例化对象自己定义的属性与其他实例化对象不通用。3.Persion类在实例化对象之后依然只有自己的两个属性 (name 和 age) 实例化对象自定义的属性仅作用于自己并不影响 类 。self 的解析与总结说实话关于 Python 中的 self 我一开始接触的时候也是给我搞的云里雾绕、五迷三道的…这里做个总结希望对同样云里雾绕、五迷三道的童鞋有所帮助。Python 中 self 代表的是 类的示例 self 在定义类的方法时是必须有的虽然在调用时不必传入相应的参数。Python 中 self 只有在针对 类 的情况下才是有意义的。self 只能用在 python 类 的方法中。具体的举例说明如下属性关于属性 - 1如果变量定义在类下面而不是类的方法下面那这个变量既是类的属性也是类实例的属性。12345678910111213141516171819classCat(object):eyes有2只眼睛legs有4条腿tail有1只尾巴dragonLiCat()dragonLi.name狸花猫dragonLi_eyesdragonLi.eyesdragonLi_legsdragonLi.legsdragonLi_taildragonLi.tailprint( 猫 Cat.eyes, Cat.legs, Cat.tail)print(dragonLi.name, dragonLi_eyes, dragonLi_legs, dragonLi_tail)# 执行结果如下# 猫 有2只眼睛 有4条腿 有1只尾巴# 狸花猫 有2只眼睛 有4条腿 有1只尾巴关于属性 - 2如果变量定义在类的方法下面如果加了self那这个变量就是类实例的属性不是类的属性如果没有加self这个变量只是这个方法的局部变量既不是类的属性也不是类实例的属性。12345678910111213141516171819202122classCat(object):eyes有2只眼睛legs有4条腿tail有1只尾巴def__init__(self):# 关于__init__() 会在下面的 类的构造器有详细讲解self.color_01黄棕色color_02黑棕色dragonLiCat()dragonLi_color_01dragonLi.color_01print(狸花猫有两种披毛颜色一种是, dragonLi_color_01)# 执行结果如下# 狸花猫有两种披毛颜色一种是 黄棕色dragonLi_color_02dragonLi.color_02print(狸花猫有两种披毛颜色另一种是, dragonLi_color_02)# 执行结果如下# AttributeError: Cat object has no attribute color_02.方法关于方法1如果在类中定义函数时加了self那这个函数是类实例的方法而不是类的方法。12345678910111213141516classCat(object):defeat(self):print(爱吃鱼)dragonLiCat()dragonLi.eat()# 执行结果如下# 爱吃鱼Cat.cat()# 执行结果如下# TypeError: Cat.eat() missing 1 required positional argument: self关于方法2如果在类中定义函数时候没有加self那这个函数就只是类的方法而不是类实例的方法。12345678910111213141516classCat(object):defeat():print(爱吃鱼)Cat.eat()# 执行结果如下# 爱吃鱼dragonLiCat()dragonLi.eat()# 执行结果如下# TypeError: Cat.eat() takes 0 positional arguments but 1 was given小结属性如果变量定义在类下面而不是类的方法下面那这个变量既是类的属性也是类实例的属性。如果变量定义在类的方法下面如果加了self那这个变量就是类实例的属性不是类的属性如果没有加self这个变量只是这个方法的局部变量既不是类的属性也不是类实例的属性。方法如果在类中定义函数时加了self那这个函数是类实例的方法而不是类的方法。如果在类中定义函数时候没有加self那这个函数就只是类的方法而不是类实例的方法。类的构造函数前面我们了解了 类的创建、类的属性、类函数的使用方法现在我们再来看看类的构造函数。什么是类的构造函数 — 构造函数是类中的一种默认函数通过定义它可以在 类实例化 的同时将参数传入类中。类似于函数执行的时候可以传一些参数
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2555509.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!