1つの記事でPythonを理解する(6)-----クラスとオブジェクト

今日はみんなに「オブジェを紹介しますご存知のとおり、Pythonはオブジェクト指向プログラミング言語です。Pythonが非常に強力である理由の大部分は、Pythonのいたるところにオブジェクトがあるためです。Pythonを学ぶための鍵の1つは、クラスを学ぶことであることがわかります。およびオブジェクト。いいです!トピックにステップインします。

1.クラスとは何ですか?オブジェクトとは何ですか


  • クラスの定義クラスには次のものが含まれます。
    • 1.クラスの静的プロパティを説明する属性
    • 2.クラスのアクションを記述するメソッド-オブジェクトの定義
  • オブジェクトの定義
    クラスによって定義されたデータ構造インスタンスは、インスタンスオブジェクトとも呼ばれます。
  • 小さなケース
# 定义一个学生类
class Stu:
    numid = 2020000078
    name = 'djk'
    gender = 1
    def Print(self):
        print('我是一个学生!')
# 实例化一个对象stu
stu = Stu()
stu.Print()

次に、クラスを定義する方法

class Stu:
    def __init__(self,numid,name,gender,loc):
        self.numid = numid
        self.name = name
        self.gender = gender
        self.loc = loc
    def Print(self):
        print(self.numid,self.name,self.gender,self.loc)
# 实例化
stu = Stu(1,'djk',1,'shandong')
# 调用Print()函数
stu.Print()

ここに自己がある理由については、他の記事で非常に明確に説明されているので、ここでは詳しく説明しません。また、Java言語と比較することで自己を理解します。Pythonのselfパラメータと__init __(self)メソッドを深く理解する-Java言語との類似性

3つ目は、オブジェクト指向の3つの特徴です。

3.1パッケージング

オブジェクトはカプセル化であり、オブジェクトに属する属性とメソッドをクラスにカプセル化し、オブジェクトが内部的にのみアクセスできるようにします。

3.2継承

  • 継承は、サブクラスが親クラス間でデータとメソッドを自動的に共有するメカニズムです。
  • ケーススタディ
class Parent:
    def Hello(self):
        print('正在调用父类的方法')
class Child(Parent):
    pass
p = Parent()
p.Hello()
c = Child()
c.Hello()

ここに画像の説明を挿入します

  • サブクラスが親クラスと同じ名前のメソッドとプロパティを定義している場合、サブクラスは親クラスに対応するプロパティとメソッドを自動的にオーバーライドします
  • ケーススタディ
class Parent:
    def Hello(self):
        print('正在调用父类的方法')
class Child(Parent):
    def Hello(self):
        print('正在调用子类的方法')
p = Parent()
p.Hello()
c = Child()
c.Hello()

ここに画像の説明を挿入します

3.3ポリモーフィズム

  • ポリモーフィズムとは何ですか?
    ポリモーフィズムとは、メソッド名は同じですが、メソッドの実装方法が異なることを意味します
  • ケーススタディ
# 多态案例
class A():
    def fun(self):
        print('我是小A')
class B():
    def fun(self):
        print('我是小B')
a = A()
a.fun()
b = B()
b.fun()

ここに画像の説明を挿入します

4.パブリックとプライベート

  • クラスClassのメンバー変数には、インスタンス属性とクラス属性の2つの属性があります。

  • インスタンス属性はコンストラクター(__init __)で定義され、定義時にselfというプレフィックスが付けられます。

  • クラス属性は、クラス内のメソッドの外部で定義された属性ですが、クラス内にあります。クラス属性はすべてのインスタンス間で共有されます。クラスの内部と外部の両方に、「class.class属性」を介してアクセスできます。

アクセスの2つの形式:メインプログラムでは、インスタンス属性はオブジェクト名を介してのみアクセスできますが、クラス属性はクラス名またはオブジェクト名を介してアクセスできます。

  • パブリックメンバー(メソッドと変数)の場合、クラスの内外でパブリックに使用できます。

  • プライベートメンバー(メソッドと変数)の場合、クラス内でのみ使用できますが、「オブジェクト名._クラス名+プライベートメンバー」、book._Book__typesなどの特別なメソッドを介してアクセスすることもできます。

    • 2つの式の形式:クラス属性を定義するときに、2つの短いアンダースコア「__」で始まる場合はプライベート属性であることを意味し、そうでない場合はパブリック属性であることを意味します。たとえば、self。size= sはプライベート属性であり、self.price = moneyはパブリック属性です。
      プライベートメソッド:2つのアンダースコア "
      "で開始し、オブジェクト名で直接呼び出すことはできません。オブジェクトに属するメソッドでのみ自分で呼び出すことができます。たとえば、self._namemethod
  • パブリックメソッド:オブジェクト名で直接呼び出します。たとえば、a.printLcs

  • 静的メソッド:クラス名とオブジェクト名で呼び出すことができますが、オブジェクトに属するメンバーに直接アクセスすることはできず、クラスに属するメンバーのみにアクセスできます。

5、いくつかの関連するBIF

メソッド名 メソッドの紹介
issubclass(class、classinfo) クラスがclassinfoのサブクラスである場合、Trueを返します
isinstance(object、classinfo) インスタンスオブジェクトオブジェクトがclassinfoクラスに属しているかどうかを確認します
hasattr(オブジェクト、名前) オブジェクトに指定された属性名があるかどうかをテストします
getattr(object、name [、default]) オブジェクトによって指定された属性値を返します。属性が存在しない場合、デフォルトが設定されていると、デフォルトが出力されます。それ以外の場合は、AttributeErrorがスローされます。
setattr(object、name、value) オブジェクトに指定された属性の値を設定します。指定された属性が存在しない場合は、新しい属性が作成され、値が割り当てられます。
delattr(オブジェクト、名前) オブジェクト内の指定された属性を削除します。指定された属性が存在しなくなった場合、AttributeError例外がスローされます。
property(fget = None、fset = None、fdel = None、fdoc = None) 自己定義属性で属性を設定する

6、クラス、クラスオブジェクト、インスタンスオブジェクトの関係

class C:
    count = 0
a = C()
b = C()
c = C()
print('a修改之前:{}'.format(a.count))
print('b修改之前:{}'.format(b.count))
print('c修改之前:{}'.format(c.count))
c.count += 10 # 修改的是实例对象c
print('c修改实例对象之后:{}'.format(c.count))
# 我们修改类对象
C.count += 100
print('a修改之后:{}'.format(a.count))
print('a修改之后:{}'.format(b.count))
print('c修改类对象之后:{}'.format(c.count))
# 为什么会这样呢?因为实例属性将类属性给覆盖了,我们只能看到实例属性,不能看到类属性

おすすめ

転載: blog.csdn.net/dongjinkun/article/details/113739258