1.为什么要面向对象编程?
任何知识,总是用到的时候才能切身体会。
概念: 面向对象和面向过程只是一个概念名词,并不难。面向对象比面向过程多的就是封装,把数据和操作方法封装到一起。说到底,还是为了程序员能更好的理解。
下面举个简单例子:
- 面向过程:(数据和函数分开的)
name = '小明'
age = 19
def introduce(n,a):
print('我叫', n)
print('我的年龄是', a)
introduce(name,age)
- 面向对象:(定义student,将数据和函数封装到一起)
class student:
def __init__(self, name, age):
self.name = name
self.age = age
def introduce(self):
print('我叫', self.name)
print('我的年龄是', self.age)
A = student('小明', 19)
A.introduce()
这样来看,似乎两者没有太大区别,封装过后,反而还多了很多代码,这样是把问题变复杂了嘛?实际上并非如此。
面向对象的优势在于:
1. 抽象的概念
A = student(姓名,年龄),你看到这里直接就能理解,A是一名学生,A存储着他的姓名和年龄。
当你使用 A.introduce() ,你就知道这是学生A在自我介绍,而不是B或者C。
2. 代表一个类别
我们知道,学生不止一个人,但是他们具备相同的属性,(这里简单地只提及姓名和年龄)。
在使用Student的封装过后,我们能用A = student(), B = student() ,就知道A和B是两个学生,现在让他们分别自我介绍:A.introduce() 和 B.introduce() 。
事实上,你可以完全不采用面向对象的方法来实现这个目的。但是在某些时候,可以通过面向对象的方式,更好地将你的想法表达出来,也更有利于其他人阅读你的代码。
2.如何面向对象编程
2.1 类和实例
我们把封装好的数据和操作方法成为,类,即类别。它代表一系列具备相同元素的抽象集合。
类是抽象的,实例是具体的。
类:有一类人是学生,有一类人是程序员,有一类人是资本家。
实例:某个人是学生,某个人是……
学生是抽象的类,“小明”是一个具体的学生(即这个类的实例)
2.2 类的定义
class student:
def __init__(self, name, age):
self.__name = name
self.age = age
def introduce(self):
print('我叫', self.__name)
print('我的年龄是', self.age)
- class
class 类名:
class 类名(父类名):
第二种在之后讲
- self
- self指代自身(相当于C++,java中的this)
- self开头的变量,如上述self.age,作用域是整个类,而如果不加self,那么age这个变量在其他函数里面就找不到了。
- class里面的函数,必须加一个参数self,证明这个函数是这个类独有的。
- __init__
双下划线init双下划线,这是一种特殊的函数,,在实例创建的时候执行。
def __init__(self, name, age):
在实例化student类时,调用方法A = student(‘小明’, 19)。是将对应参数传入init函数里面进行初始化的。
对应的还有__del__,是在实例结束的时候执行,做一些销毁工作。
- 其他注意事项
私有变量:例如上方self.__name__,加了双下划线,那么代表这个变量不想被外部访问,你只能通过class内部定义的函数来修改。
而像self.age,你就可以直接通过A.age来访问并修改。
print(A.age) # 可以执行
print(A.__name__) # 不可以执行
作用域:一个变量能够产生作用的区域。
class student:
def __init__(self, name, age):
self.__name = name
self.age = age
weight = 70
print('体重为',weight)
def introduce(self):
print('我叫', self.__name)
print('我的年龄是', self.age)
例如上面这段代码,weight只作用于init函数内部,在introduce里面,你就找不到weight了。
而使用self.开头的变量,可以在整个class内部都能使用。
2.3 继承
示例:
class person:
def __init__(self, name, age):
self.__name = name
self.age = age
def introduce(self):
print('我叫', self.__name)
print('我的年龄是', self.age)
class student(person):
def __init__(self, name, age, id):
self.id = id
person.__init__(self, name, age)
def introduce_id(self):
print('我的学号是', self.id)
A = student('小明', 18, '123456')
A.introduce()
A.introduce_id()
student继承自person类,继承person的公有变量,函数.
可以直接使用person类中的introduce()
当student也定义introduce()时,会覆盖父类的同名函数.
继承–实际上做了什么?
class student:
def __init__(self, name, age, id):
self.id = id
self.__name = name
self.age = age
def introduce_id(self):
print('我的学号是', self.id)
def introduce(self):
print('我叫', self.__name)
print('我的年龄是', self.age)
使用class student(person),实际上做的就是上面这些代码.
为什么要使用继承?
目的:提高可复用性.
person的一段代码,既可以被student继承,也可以被teacher继承,还有其他等等等等.
这样不用重复写name,age,还有introduce了.
- 对于其他相关的知识,在实际运用的时候再去学习吧.