Python学习笔记 八:面向对象编程完整篇

我之前也写了一篇关于面向对象编程的博客,两篇博客内容相近,包含了我这两次学习的全部内容

第一篇博客

1. 转义字符

  • \n:换行
  • \t:制表符,tab
  • “\”号后面可以跟八进制或者十六进制来表示字符,如\141、\x61表示a
  • “\”号后面可以跟Unicode字符编码来表示字符
  • 如果不希望“\”表示转义,前面可以跟r,如r\

2. 格式化

  • 方法一:用“%”
  • 方法二:使用format
  • 方法三:在字符串前加上字母f
a, b = 5, 10

# 方法1:
print('%d * %d = %d' % (a, b, a * b))

# 方法2:
print('{0} * {1} = {2}'.format(a, b, a * b))

# 方法3:
print(f'{a} * {b} = {a * b}')    # 适用于python 3.6以后的版本

3. 面向对象编程

  • 对于面向对象,我想大家都不陌生,但是怎么简要的概括什么是面向对象呢?这是一个很有意思的问题。我学习过c语言、c#、java等编程语言,但是对面向对象的解释依然不是很明确。这是一直困扰着我的问题,什么是面向对象?

  • "把一组数据结构和处理它们的方法组成对象(object),把相同行为的对象归纳为类(class),通过类的封装(encapsulation)隐藏内部细节,通过继承(inheritance)实现类的特化(specialization)和泛化(generalization),通过多态(polymorphism)实现基于对象类型的动态分派。"这样的解释也许不好明白

  • 但是今天看到一个解释,也许更通俗易懂:
    知乎图片

4. 类和对象

  • 简单的说,类是对象的蓝图和模板,而对象是类的实例。
  • 这个解释虽然有点像用概念在解释概念,但是从这句话我们至少可以看出
    • 类是抽象的概念,而对象是具体的东西。
  • 在面向对象编程的世界中,一切皆为对象,对象都有属性和行为,每个对象都是独一无二的,而且对象一定属于某个类(型)。
  • 当我们把一大堆拥有共同特征的对象的静态特征(属性)和动态特征(行为)都抽取出来后,就可以定义出一个叫做“类”的东西。

5. 定义类

  • class关键字
  • 其中,写在类中的函数,我们通常称之为(对象的)方法,这些方法就是对象可以接收的消息
class Student(object):

    # __init__是一个特殊方法用于在创建对象时进行初始化操作
    # 通过这个方法我们可以为学生对象绑定name和age两个属性
    def __init__(self, name, age):
        self.name = name
        self.age = age

        
    def study(self, courseName):
        print('%s正在学习%s.' % (self.name, courseName))

        
    # PEP 8要求标识符的名字用全小写多个单词用下划线连接
    # 但是部分程序员和公司更倾向于使用驼峰命名法(驼峰标识)
    def watchMovie(self):
        if self.age < 12:
            print('%s观看《喜羊羊》.' % self.name)
        else:
            print('%s快去学校上课.' % self.name)
            

6.创建和使用对象

  • 当定义好一个类之后,可以通过下面的方式来创建对象,并给对象发消息
def main():
    # 创建学生对象并指定姓名和年龄
    stu1 = Student('amy', 21)
    # 给对象发study消息
    stu1.study('Python')
    # 给对象发watchMovie消息
    stu1.watchMovie()
    stu2 = Student('李小白', 15)
    stu2.study('高等数学')
    stu2.watchMovie()


if __name__ == '__main__':
    main()

7.访问可见性问题

  • 在Python中,属性和方法的访问权限只有两种,也就是公开的和私有的,如果希望属性是私有的,在给属性命名时可以用两个下划线作为开头
class Test:

    def __init__(self, name):
        self.__name = Jackson

    def __bar(self):
        print(self.__name)
        print('__age')


def main():
    test = Test('hello')
    test.__age()       # AttributeError: 'Test' object has no attribute '__age'
    print(test.__name) # AttributeError: 'Test' object has no attribute '__name'


if __name__ == "__main__":
    main()

案例1:设计一个函数产生指定长度的验证码,验证码由大小写字母和数字构成
import random


def generateCode(codeLen=4):
    """
    生成指定长度的验证码

    :param codeLen: 验证码的长度(默认4个字符)

    :return: 由大小写英文字母和数字构成的随机验证码
    """
    allChars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
    lastPos = len(allChars) - 1   # 生成allChars的长度,应为:61
    code = ''                     # 以空格隔开
    for _ in range(codeLen):
        index = random.randint(0, lastPos)
        code += allChars[index]
    return code
案例2:打印杨辉三角
def main():
    num = int(input('请输入行数为: '))
    yh = [[]] * num
    for row in range(len(yh)):
        yh[row] = [None] * (row + 1)
        for col in range(len(yh[row])):
            if col == 0 or col == row:
                yh[row][col] = 1
            else:
                yh[row][col] = yh[row - 1][col] + yh[row - 1][col - 1]
            print(yh[row][col], end='\t')
        print()


if __name__ == '__main__':
    main()
案例3:双色球选号
  • 这个例子涉及到相对专业的知识,我没有读懂,希望读者看完之后,能够告诉我你的想法。
from random import randrange, randint, sample


def display(balls):
    """
    输出列表中的双色球号码
    """
    for index, ball in enumerate(balls):
        if index == len(balls) - 1:
            print('|', end=' ')
        print('%02d' % ball, end=' ')
    print()


def random_select():
    """
    随机选择一组号码
    """
    red_balls = [x for x in range(1, 34)]
    selected_balls = []
    selected_balls = sample(red_balls, 6)
    selected_balls.sort()
    selected_balls.append(randint(1, 16))
    return selected_balls


def main():
    n = int(input('机选几注: '))
    for _ in range(n):
        display(random_select())


if __name__ == '__main__':
    main()

综合案例1:定义一个类描述自动走时数字时钟
from time import sleep


class Clock(object):
    """数字时钟"""

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

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

    def run(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():
    clock = Clock(12, 00, 00)
    while True:
        print(clock.show())
        sleep(1)
        clock.run()


if __name__ == '__main__':
    main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jackson的生态模型

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值