Pythonの研究ノート8:完全なオブジェクト指向プログラミング

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

最初のブログ

1.エスケープ文字

  • \ n:改行
  • \ t:タブ文字、タブ
  • 「\」の後に8進数または16進数を続けて、文字を表すことができます。たとえば、\ 141、\ x61
  • 「\」の後にUnicode文字コードを続けて文字を表すことができます
  • 「\」でエスケープを示したくない場合は、その前にr \などのrを付けることができます。

2.フォーマット

  • 方法1:「%」を使用する
  • 方法2:フォーマットを使用する
  • 方法3:文字列の前に文字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などのプログラミング言語を勉強しましたが、オブジェクト指向の解釈はまだあまり明確ではありません。これは私を悩ませてきた質問です。オブジェクト指向とは何ですか?

  • 「データ構造とメソッドのセットを作成して、それらをオブジェクトに処理し、同じ動作のオブジェクトをクラスにグループ化し、クラスのカプセル化によって内部の詳細を非表示にし、継承によってクラスの特殊化を実現します。多態性)オブジェクトタイプに基づいた動的割り当てを実現するために。「このような説明は理解しにくいかもしれません。

  • しかし、今日私は説明を見ました。それは理解しやすいかもしれません:
    写真を知っている

4.クラスとオブジェクト

  • 簡単に言えば、クラスはオブジェクトの青写真とテンプレートであり、オブジェクトはクラスのインスタンスです。
  • この説明は、概念を使用して概念を説明するのと少し似ていますが、少なくともこの文から見ることができます
    • クラスは抽象的な概念であり、オブジェクトは具体的なものです。
  • オブジェクト指向プログラミングの世界では、すべてがオブジェクトです。オブジェクトには属性と動作があります。各オブジェクトは一意であり、特定のクラス(タイプ)に属している必要があります。
  • 共通の特性を共有する多数のオブジェクトの静的特性(属性)と動的特性(動作)を抽出すると、「クラス」と呼ばれるものを定義できます。

5.クラスを定義します

  • クラスキーワード
  • その中で、クラスで記述された関数は通常(オブジェクト)メソッドと呼ばれ、これらのメソッドはオブジェクトが受信できるメッセージです。
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では、属性とメソッドのアクセス許可には、パブリックとプライベートの2種類しかありません。属性をプライベートにする場合は、属性に名前を付けるときに最初に2つのアンダースコアを使用できます。
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:2色のボール番号の選択

  • この例は比較的専門的な知識が含まれていますが、私には理解できませんでした。読者が読んだ後の感想を教えてくれることを願っています。
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()

おすすめ

転載: blog.csdn.net/amyniez/article/details/104557045