学到中年的python学习笔记06--面向对象基础编程


前言

当下要想深入的了解编程肯定要学习“面向对象”,到底什么是面向对象编程呢?我们可以参考官方的说法:类(class)提供了一种将数据和功能捆绑在一起的方法。创建一个新类将创建一种新的对象类型,从而允许创建该类型的新实例。每个类实例可以具有附加的属性以维护其状态。类实例还可以具有用于修改其状态的方法(由其类定义)。
程序是指令集,我们通过英语字符构造的语句在执行时会变成一条条指令由CPU去执行。有时候我们为了简化程序的设计,我们引入了函数的概念,把相对独立且时常重复的代码放置到函数中,在需要使用这些功能的时候我们只需要让我们的程序代码能找到该函数并将数据交给函数去处理;如果一个函数的功能太复杂,可以将函数继续切割为子函数来降低系统的复杂性。

面向对象也不能解决软件开发中所有的问题。因为计算机这三个字包含的不仅仅是一堆硬件的工作,我将他比喻成一艘船,而一艘木船到泰坦尼克号的发展除了船体本身发生了变化外,还需要电、内燃、铁、燃料等等,比如木船是绝对不能使用煤炭作为主要驱动力的。而计算机诞生的很多编程语言对于计算机来说就是造船的工具,如果说C语言造出了钢铁,那么其他的语言有造燃料的、有发电的、有控制动力的等等。只不过越往后人们就发现底层其实是不需要太好的工具,船体只需要坚固,而舱内不仅仅需要加固还要泳池、美食、大床房、还需要更多的娱乐设施。所以需要有更多的工具进行专们的定制化制造。所以高级程序设计语言几乎都提供了对多种编程模式的支持,py也一样。


一、类和对象

类和对象,类就是对象的蓝图和模板,而对象是类的实例。这个解释我也看不懂,就凑合着理解吧。类是很抽象的,而对象是具体的。面象对象编程,一切皆为对象,对象都有属性和行为,每个对象都是独一无二的,而且对象都属于某一个类型。如果把一大堆拥有共同特征的对象的静态特征(属性)和动态特征(行为)都抽取出来,就可以定义一个叫“类”的东西。

个人建议:在学习面向对象的时候文字性的东西先不要看,完全可以去抄一些实例代码,多抄几遍,你肯定会有问题,然后再去看原理。

二、定义类

python中可以使用class关键字定义类,然后在类中通过之前学习的函数来定义方法,这样便将对象的动态特征描述出来。

class Student(object):
	# __init__是一个特殊的方法用于在创建对象时进行初始化操作
	# 通过这个方法我们可以为Student对象绑定两个属性name和age
	def __init__(self,name,age)
		self.name = name
		self.age = age
	
	def study(self,course_name):
		print('%s正在学习%s.' % (self.name,course_name))

	def watch_move(self):
		if self.age < 18:
			print('%s只能观看《咦咦啊啊哦哦》.' % self.name)
		else:
			print('%s正在观看*.*.' % self.name)
			

写在类中的函数,通尝称之为(对象的)方法,这些方法就是对象可以接收的消息

创建和使用对象

当定义好一个类后,可以通过下面的方式来创建对象并给对象发消息

def main():
	# 给对象(Student)赋值
    Student1 = Student('特朗皮', 55)
    # 使用对象的study方法
    Student1.study('《如何在输掉DX后保持微笑》')
    # 使用对象的watch_move方法
    Student1.watch_move()
    Student2 = Student('小小怪', 16)
    Student2.study('《儿歌一万首》')
    Student2.watch_move()

if __name__ == "__main__":
    main()

输出结果
在这里插入图片描述

访问可见性

这里要学习绑定属性的权限问题(好像大家都叫可见性),对象的属性会有私有的(private)或者受保护的(protected),而对象的方法通尝是公开的(public),因为公开的方法就是对象能够接收到的消息。属性和方法的访问权限只有两种,也就是公开的和私有的,要设置为私有的,在命名时就需要以两个下划线作为开头。

class newObject():

	def __init__(self,newO):
		self.__newO = newO
	
	def __bar(self):
		print(self.__newO)
		print('__bar')
	
def main():
	test = newObject('hello boy')
	test.__bar()
	print(test.__newO)

if __name__ == "__main__":
	main()

python也并没有从语法上严格的保证私有属性或方法的私密性,它只是给私有的属性和方法换了一个名字来妨碍对他们的访问,如果我们知道了更换名字的规则仍然可以访问到他们,下面的代码就是很好的说明。

class newObject():

    def __init__(self, newO):
        self.__newO = newO

    def __bar(self):
        print(self.__newO)
        # print('__bar')

def main():
    new1 = newObject('say hello')
    new1._newObject__bar()
    print(new1._newObject__newO)
    
if __name__ == "__main__":
    main()

面向对象的三大特性

1.封装

隐藏对象的属性和实现细节,仅对外提供公共访问方式(简单的编程接口),将变化隔离,便于使用。

2.继承

提高代码的复用性,继承是多态的前提。

3.多态

父类或接口的定义的应用变量可以指向子类或具体实现类的实例对象,提高程序的扩展性。
注意:在接下来的练习中我们使用单下划线开头来表示属性是受保护的,跟着大佬的脚步走,但是使用但下划线开头的属性仍然可以被外界访问到。

练习1 定义一个类描述一下数字时钟

from time import sleep
import os

class clock():

    def __init__(self,hour=0,minute=0,second=0):
        """初始化方法

            时 hour
            分 minute
            秒 second 
        """
        self._hour = hour
        self._minute = minute
        self._second = second

    def clockRun(self):
        self._second += 1
        if self._second == 60:
            self._second = 0
            self._minute += 1
            if self._minute == 60:
                self._minute = 0
                self._hour += 1
                if self._hour == 24:
                    self._hour = 0
    def show(self):
        '''显示时间'''
        return '%02d:%02d:%02d' % (self._hour,self._minute,self._second)

def main():
    clockshow = clock(23,55,11)
    while True:
        print(clockshow.show())
        sleep(1)
        clockshow.clockRun()
        os.system('cls')


if __name__ == "__main__":
    main()

练习2 定义一个类描述平面上的点并提供移动点和计算到另一个点距离的方法

from math import sqrt

class Pdistance(object):

    def __init__(self,x=0,y=0):
        '''初始化方法
        x: 横坐标
        y: 纵坐标
        '''
        self._x = x
        self._y = y
    def moveCoor(self,x,y):
        '''移动的位置坐标
        x:新的横坐标
        y:新的纵坐标
        '''
        self._x = x
        self._y = y
    def moveAdd(self,dx,dy):
        '''移动的增量
        dx:横坐标移动的增量
        dy:纵坐标移动的增量
        '''
        self._x += dx
        self._y += dy
    def distanceTo(self,other):
        '''计算两点之间的距离
        other: 另一个点
        '''
        dx = self._x - other._x
        dy = self._y - other._y
        return sqrt(dx**2 + dy ** 2)
    def __str__(self):
        return '(%s,%s)' % (str(self._x),str(self._y))

def main():
    p1 = Pdistance(3,5)
    p2 = Pdistance()
    print(p1)
    print(p2)
    p2.moveCoor(-1,3)
    print(p2)
    print(p1.distanceTo(p2))

if __name__ == "__main__":
    main()

总结

学习是一个漫长枯燥的过程,唯有坚持才能让你收获更多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值