现在都流行面前对象编程。文字介绍可能看得很晕,看不懂和不理解当然看得晕,不用怕,慢慢看到最后你会有所收获。
![3b22d4bddcfe5eb7e509c8e67afc1793.png](https://i-blog.csdnimg.cn/blog_migrate/286fe374fc741e304c519563a06ceb29.jpeg)
- 如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在头脑里头形成一个基本的面向对象的概念,这样有助于你更容易的学习Python的面向对象编程。
- 面向对象编程(Object Oriented Programming),简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。
- Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的。我们将详细介绍Python的面向对象编程。
- 在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)的概念。
python新手学习面向对象基本特征:
在Python中,定义类是通过class关键字,class后面紧接着是类名,即ClassName,类名通常是大写开头的单词。我喜欢驼峰式写法首字母都大写。
定义类:
第一种类名后面直接跟冒号。
![8dd03864063decfb03b93befc9210fa6.png](https://i-blog.csdnimg.cn/blog_migrate/d8adfe69eab7d18b7d21500b261715c7.jpeg)
第二种类名后面跟小括号再冒号。
![583c549b1907867ed1a2b76c33fbea62.png](https://i-blog.csdnimg.cn/blog_migrate/8aa8e78f81b2c69a1c14ee9fe86695df.jpeg)
第三种类名后面括号中object再跟冒号。
![222537beaa8cc56946e33ce83c827e1a.png](https://i-blog.csdnimg.cn/blog_migrate/329631ac07fa63cc3bdd7c1de463ac27.jpeg)
三种的关系:第一种和第二种程序会默认就是第三种,第一种和第二种只是简写。如果没有继承自定义的类,就可以这样写。
如果要继承自定义的类就不能够简写。(object),表示该类是从哪个类继承下来的,继承的概念我们后面再讲,通常,如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类。
比如你有个类叫object1,你想继承object1,你用简写就直接继承程序默认的object。
方法:事实它就是一个函数,只不过在类中定义的时候叫方法。
属性:事实它就是一个变量,只不过在类中定义的时候叫属性和有点不同。
构造函数:__init__()该方法在类实例化时会自动调用,又叫初始化方法。
![ec1cee9210d8e6a9abf3393e05f8f110.png](https://i-blog.csdnimg.cn/blog_migrate/3fb9fcd788b650009ed8636b5c83cab6.jpeg)
其中构造方法有两个参数(id 和 age),self.id和self.age就是两个属性。
实例化对象:
![f94c789d1d992c5055229046ae139865.png](https://i-blog.csdnimg.cn/blog_migrate/fc3f48d1b7073e9fcf6edd0cc3481423.jpeg)
创建多一个方法output(),打印构造函数的属性。
创建实例:
![3d7fabc686df08ac7d507f7aabbbaece.png](https://i-blog.csdnimg.cn/blog_migrate/9c450b1e61fca7db10b59cf105f1d535.jpeg)
输出结果:
![d66647ca250ec2e5264d864e6f904230.png](https://i-blog.csdnimg.cn/blog_migrate/2382dc84a761dd75d942d54f8d4e1e19.jpeg)
self代表类的实例,而非类
类的方法与普通的函数只有一个特别的区别:
在类地内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数self,且为第一个参数,self代表的是类的实例。
self的名字并不是规定死的,也可以使用this,但是最好还是按照约定是用self。
self就是实例化op自身,其中self.name可以等同op.name。
以后再创建一个xh= ClassName('小红',18),这个时候self就是xh。
注意点:
注意到__init__方法的第一个参数永远是self,表示创建的实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。
有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器自己会把实例变量传进去。
类属性与方法
类的私有属性
__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时self.__private_attrs。
类的私有方法
__private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类地外部调用。self.__private_methods。
![e6786fd061b548933a1dcdb1507bf0ed.png](https://i-blog.csdnimg.cn/blog_migrate/f8806edc512478a14ebfddf81d067ba8.jpeg)
继承:Python 同样支持类的继承,如果一种语言不支持继承,类就没有什么意义。
在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)。
继承和方法重写:
定义一个People人类,用Student学生类继承People人类。
如果你的父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法。子类只需要写一个跟父类相同的方法(函数)就可以覆盖重写。
![b057abcd8299c61d6bf66f38f55ec373.png](https://i-blog.csdnimg.cn/blog_migrate/4ee1f47fb06ebc945a3c558cfa96f49b.jpeg)
输出结果:
![d8982bde97484d0aefbb4392bb677d00.png](https://i-blog.csdnimg.cn/blog_migrate/01dd0dce90b8dcc9265840001dd0f9ee.jpeg)
总结概论:
class关键字后面跟类名,继承就在小括号里面输入需要继承的类名。
__init__()构造函数该方法在类实例化时会自动调用。比如你从外面回来要进家之前要用钥匙开门,这个步骤就是初始化。
__del__() 析构函数,释放对象时使用。比如你每次锁门要出去,析构函数默认你锁上门就完了。突然有一次抽风对门说:芝麻关门。析构函数就是程序执行完之前要做的最后一件事。
self的名字并不是规定死的,也可以使用this,但是最好还是按照约定是用self。
子类方法和父类方法相同,子类方法会覆盖父类方法。
继承用个例子说:
定义一个商场类和一个人类,人类继承商场类。
![785ca77e48297d90c435ee39fbe68359.png](https://i-blog.csdnimg.cn/blog_migrate/9f5981b9361112e391db2c889dba7937.jpeg)
实例化对象:
![0e574900e599432aaca3f936ddbd2f7f.png](https://i-blog.csdnimg.cn/blog_migrate/25e65e95a4a0db6da488fcdf7519b5ad.jpeg)
输出结果:
![5647b3555fec2562348f86b3df94c7b9.png](https://i-blog.csdnimg.cn/blog_migrate/cdc9f0386d2bac7fe04e12eabf42cd26.jpeg)
分析例子:
商场类中有两个方法分别是买和卖。人类中只有一个go()方法。人类继承商场类中两个方法。所以后面的实例化对象中都是人类People():
xm.buy()是父类的商场类的方法,由于继承的关系,所以可以直接使用。
xh.go()是人类People()中本身方法。
xh.sell()是父类的商场类的方法,由于继承的关系,所以可以直接使用。
基础的面向对象能够了解:定义类、构造函数、方法、属性、私有化、方法重写、继承这几点就算入门,其实还有很多高级的用法。再python深入学习中逐渐掌握。