Pythonの研究ノート4:オブジェクト指向プログラミング(OOP)

1.OOP(オブジェクト指向プログラミング)

  • 思想:

    • モジュール式思考でエンジニアリングの問題を解決する
    • プロセス指向とオブジェクト指向
    • プロセス指向からオブジェクト指向へ
    • たとえば、私は学校を開きたいと思っています。
      • 講師
      • 校長
      • 学生
      • 教室
      • 。。。。。。。。
  • 一般的な名詞

    • OO:オブジェクト指向
    • OOA:分析
    • OOD:デザイン
    • OOP:プログラミング
    • OOI:実装
    • OOA-> OOD-> EOI
  • クラスとオブジェクト(2つは属性関係ですが、構成関係ではありません)

    • クラス:抽象、コレクションの説明、共通性に焦点を当てる(学生クラス)
    • オブジェクト:具体的、個人を説明する(張氏)
  • クラスの内容:

    • アクション、機能
    • 属性、変数
  • クラスを定義します:classキーワード

  • クラスの命名:

    • 大きなこぶに従ってください(各単語の最初の文字は大文字です)
    • 最初の文字を大文字にする
# 定义学生类,和几个学生

class Student():
    # 此处定义一个空类
    # pass是关键字,表示占位用的,无意义(养成好习惯)
    pass
# 定义一个对象
zhangsan = Student()
# 定义时,全体缩进
class PythonStudent():
    name = "Nobody"
    age = 20
    course = "Python"
    '''
    定义类中的函数,一般要有self关键字
    其余跟普通函数基本相同
    
    '''
    
    def giveMoney(self):
        print("show me the money")
        return None
    
lisi = PythonStudent()
print(lisi.name)
print(lisi.age)
print(lisi.course)

誰も
20
のPython

2.クラスの属性

# 类的例子
# 注意类的定义
class Student():
    # name,age是类的变量
    name = "amy"
    age = 20
    
    def sayHi(self):
        print("类的属性")
        return None
    
    
    def sayHello(koko):
        print("将self替换为koko")
        return None 
# 实例化
lisi = Student()

print(lisi)

2.1自己

  • 自己は別の名前に置き換えることができます
  • 自己はキーワードではありません
  • 役割はそれ自体を指します
# self举例

# 实例调用函

honghong = Student() # 实例化yaoyao

# 让honghong跟我打招呼
# honghong调用sayHi没有输入参数
# 因为迷人实例作为第一个传入的参数,即honghong代替self
honghong.sayHi()

# 错误的案例:
# a = "你好"
# honghong.sayHi(a)

クラス属性

#这个案例说明self的名称可以更改,实际上self为形参
honghong.sayHello()

自分をココに置き換える

2.2クラス変数スコープの問題

  • クラス変数:クラス自体に属する変数
  • インスタンス変数:インスタンスに属する変数
  • 次の2つのケースの要約:
    • インスタンスのプロパティを定義した後、インスタンスのプロパティにアクセスするときは、インスタンス自体のプロパティへのアクセスが優先されます。そうでない場合は、クラスのプロパティにアクセスします。
# 案例1:

# 注意类的定义
class Student():
    
    # name,age是类的变量
    name = "amy_77"
    age = 20
    
    def sayHi(self):
        print("My Name is {}, i am {} years old".format(self.name,self.age))
        self.age = 21
        self.name = "NoName"
        return None

# 此案例说明,实例变量可以借用类的变量
qianqian = Student()
qianqian.sayHi()

私の名前はamy_77です。20歳です。

# 案例2:

# 注意类的定义
class Student2():
    
    # name,age是类的变量
    name = "amy_77"
    age = 20
    
    def sayHi(self, n, a ):  # 实例变量,给self定义自己的变量name和age
        self.name = n
        self.age = a
        
        print("My Name is {}, i am {} years old".format(self.name,self.age))
        return None

# 此案例说明,实例变量可以借用类的变量
qianqian = Student2()

# 注意观察下面语句打开和关闭后的区别
# qianqian.sayHi("yuanyuan", 30)

print("My Name is {}, i am {} years old".format(Student2.name,Student2.age))
print("My Name is {}, i am {} years old".format(yuanyuan.name,yuanyuan.age))

#若果访问实例的属性没有定义,则自动访问类的属性
# 如果类也没有定义,则报错

私の名前はamy_77、私は20歳です
私の名前はamy_77、私は20歳です

2.3クラスのプロパティへのアクセス

  • クラス内のクラスの属性へのアクセスを強制する場合は、__ class __(前後に2つのアンダースコア)を使用する必要があります。
  • クラスメソッド:
    • クラスのメソッドを定義するとき、自己パラメータはありません
    • クラスのコンテンツのみがクラスのメソッドで許可されます
    • 2つの方法
      • クラス名
      • __クラス__(前後に2つのアンダースコア)
class Student3():
    
    # name,age是类的变量
    name = "amy_77"
    age = 20
    
    def sayHi(self):
        print("My Name is {}, i am {} years old".format(self.name,self.age))
        return None
    
    
    # SOS是类的方法
    def SOS():
        # 类方法中不允许访问实例的任何内容
        #print("My Name is {}, i am {} years old".format(self.name,self.age))
        
        # 如果访问想要类的内容,有下面两种方法:
        print("My Name is {}, i am {} years old".format(Student3.name,__class__.age))
        return None
    
# 体验类的方法
s = Student3()
s.sayHi()

# 调用类方法的例子
Student3.SOS()
# SOS() takes 0 positional arguments but 1 was given
# SOS()接受0个位置参数,但给出了1个

私の名前はamy_77、私は20歳です
私の名前はamy_77、私は20歳です

2.4コンストラクタ

  • クラスがインスタンス化されると、いくつかの基本的な初期化作業が実行されます
  • 特別な名前と言葉遣いを使用する
    • インスタンス化時に自動的に実行されます
    • インスタンス化時に実行される「最初の」関数ですか
class Student4():
    name = "Everybody"
    age = 0
    
    # 构造函数名称固定,写法相对固定
    def __init__(self):
        print("我是一个构造函数")


qianqian = Student4()
print("*******************")
print(qianqian.name)
print(qianqian.age)

私はコンストラクターです


みんな
0

3.オブジェクト指向の3つの特徴

  • 継承
  • カプセル化
  • ポリモーフィズム

3.1継承(Pythonはホイールを繰り返さない)

  • 品詞は、親クラスなどで定義されたコンテンツや動作を使用できます。
  • 継承の実装:
    • 親クラス、基本クラス、スーパークラス:継承クラス、基本クラス、スーパークラス

    • サブクラス、継承された動作を持つクラス

    • すべてのクラスには親クラスが必要です

    • そうでない場合、デフォルトはオブジェクトの品詞です

# 所有类必须有父类
# 默认为object
class Person1():
    pass

class Person2(object):
    pass

class Person():
    name = "NoName"
    age = 0
    
# 父类写在类定义的时候的括号里
class Teacher(Person):
    pass

t = Teacher()
print(t.name)
    

ノーネーム

class Bird():
    fly = "Yes,I can"
    
    def flying(self):
        print("飞呀飞呀")
        
class BirdMan(Person, Bird):
    pass

bm = BirdMan()
bm.flying()
print(bm.name

Fly Fly
NoName

3.2 issubclassは、それがサブクラスであるかどうかを検出します

  • 2つのクラスの親子関係を検出するために使用できます
# 利用刚才定义的Bird,BirdMan,Person,Teacher,检测父子关系

print(issubclass(BirdMan, Bird))
print(issubclass(BirdMan, Person))
print(issubclass(BirdMan, Teacher))

# help(issubclass)





4.コンストラクター

  • 関数がインスタンス化されたときに呼び出される関数
  • 自動通話
  • 請求:
    • 最初のパラメータが存在する必要があり、通常は自己として推奨されます
  • コンストラクターの呼び出し時間:一般的に、インスタンス化時に初めて呼び出されると考えられています。
  • 通常、手動で呼び出されるのではなく、インスタンス化されると自動的に呼び出されます。パラメータは、クラス名の後に角かっこで囲む必要があります。
class Bird():
    def __init__(self):
        print("我被调用了")
        return None
    
# 此时被调用构造函数
b = Bird()

私は呼ばれた

# 构造函数2

class Person():
    def __init__(self, name, age):
        print(name, age)
        
p = Person("amy", 21)

エイミー21

4.1コンストラクターの継承

  • コンストラクターのデフォルトの継承
  • サブクラスがコンストラクターを定義すると、親クラスのコンストラクターが自動的に呼び出されなくなります
# 构造函数默认继承

class Person():
    def __init__(self, name, age):
        print("Person = ({}, {})".format(name, age))
        
        
# Teacher自动继承上面的构造函数
class Teacher(Person):
    pass

t = Teacher("amy", 21)

t = Teacher()# 此代码报错

人=(エイミー、21)

おすすめ

転載: blog.csdn.net/amyniez/article/details/104363590
おすすめ