【重学python】3.面向对象编程

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
  1. self指代自身(相当于C++,java中的this)
  2. self开头的变量,如上述self.age,作用域是整个类,而如果不加self,那么age这个变量在其他函数里面就找不到了。
  3. 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了.

  • 对于其他相关的知识,在实际运用的时候再去学习吧.
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值