ホームページ >バックエンド開発 >Python チュートリアル >Python オブジェクト指向プログラミング - 初級

Python オブジェクト指向プログラミング - 初級

王林
王林転載
2023-04-11 23:58:051951ブラウズ

はじめに

オブジェクト指向: オブジェクト (エンティティ) の概念を使用してモデルを構築し、客観的な世界をシミュレートしてソフトウェアを分析、設計、実装します。オブジェクト指向プログラミング (略して OOP) は、ソフトウェアの再利用を解決する設計およびプログラミング手法です。ソフトウェア システム内の類似の操作ロジックや操作アプリケーションのデータと状態をクラスとオブジェクトの形式で記述します。サンプルの形式は、次の形式で再利用されます。ソフトウェア開発効率を向上させるソフトウェアシステム。

オブジェクト指向プログラミングは、Python において非常に重要な概念です。

1. オブジェクト指向とプロセス指向

1. 2 種類のソフトウェア開発および設計手法

  1. プロセス指向プログラミング: 上から下へ開発の手順やプロセスを中心に、使用する関数コードを関数にカプセル化します 典型的なコードは C 言語です (プロセスを中心に)
  2. オブジェクト指向プログラミング: 分類関数や必要な関数をカプセル化します。どの特定のクラスと関数がその関数を実装しているかに注目してください。典型的なコードは Java、C、その他の言語です (結果に注目してください)

2.オブジェクト指向関連用語

  • クラス (クラス) : 同じプロパティとメソッドを持つオブジェクトのコレクションを記述するために使用されます。コレクション内の各オブジェクトに共通のプロパティとメソッドを定義します。オブジェクトは次のとおりです。クラスのインスタンス。
  • インスタンス: オブジェクトとも呼ばれます。クラスで定義された初期化メソッドを通じて、特定の値が与えられ、「血肉となる実体」となります。
  • クラス変数: クラス変数は、インスタンス化されたオブジェクト全体でパブリックです。クラス変数は、クラス内および関数本体の外で定義されます。クラス変数は通常、インスタンス変数としては使用されません。
  • データ メンバー: クラス変数またはインスタンス変数。クラスとそのインスタンス オブジェクトに関連するデータを処理するために使用されます。
  • メソッドの書き換え: 親クラスから継承したメソッドがサブクラスのニーズを満たせない場合は、メソッドを書き換えることができます。このプロセスはメソッド オーバーライドと呼ばれ、メソッドの書き換えとも呼ばれます。
  • ローカル変数: メソッドで定義された変数は、現在のインスタンスのクラスにのみ作用します。
  • インスタンス変数: クラスの宣言では、属性は変数によって表されます。このような変数はインスタンス変数と呼ばれ、クラス宣言の内部で、クラスの他のメンバー メソッドの外部で宣言されます。
  • メソッド: クラスで定義された関数。
  • メソッドの書き換え: 親クラスから継承したメソッドがサブクラスのニーズを満たせない場合、メソッドを書き換えることができます。このプロセスはメソッド オーバーライド (オーバーライド) と呼ばれ、メソッドの書き換えとも呼ばれます。
  • 静的メソッド: インスタンス化せずにクラスによって実行できるメソッド。
  • クラス メソッド: クラス メソッドは、クラス自体をオブジェクトとして操作するメソッドです。

オブジェクト指向の 3 つの主要な特徴:

  • カプセル化: 内部実装をラップし、外部に対して透過的にし、メカニズムを提供します。 APIインターフェースを呼び出すためのものです。
  • 継承: つまり、派生クラスは親クラス (基本クラス) の変数とメソッドを継承します。
  • ポリモーフィズム: オブジェクトの種類に応じてさまざまな方法で処理されます。

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

1. オブジェクト

オブジェクトはオブジェクト指向プログラミングの中核です。共通の特性と動作 クラスを形成するオブジェクトの抽象定義のセット

2. クラス

1) 概念

クラスは物のタイプであり、オブジェクトクラスは同じ属性と動作を持ちます。

2) クラスの構成

  • クラス名: クラスの名前
  • 属性: 物事の特性
  • 方法: 具体的に何をするか

3) 抽象化

同じまたは類似した属性と動作を持つオブジェクトを抽象化できます。クラスへの組み込み

4) クラス分類

クラスを作成するには、class キーワードを使用し、クラス名を追加し、括弧内にオブジェクトを入れて括弧を追加します。このようなクラスは、と呼ばれます。新しいスタイルのクラス。括弧なしでオブジェクトを括弧で囲んだりすることもできます。このようなクラスは、クラシック クラスと呼ばれます。

# 新式类 
class Meeting2(object): 
pass 
# 经典类 
class Meeting2: 
pass

5) オブジェクトの作成

A = Meeting1() 
B

6) self

クラス メソッドの最初のパラメータは self である必要があります (慣例により self ですが、他の名前にすることもできます) )、通話時に渡す必要はありません。 self はクラスのインスタンスを表します

3. オブジェクト属性の取得または追加

次のような Meeting という名前のクラスがあり、名前、年齢、性別、住所、攻撃などの属性が設定されています。定義 導入と攻撃には 2 つのメソッドがあります:

class Meeting(object):
"""meeting类的类描述"""

def __init__(self, name, age, sex, address, attack):
"""构造函数"""
self.name = name
self.age = int(age)
self.sex = sex
self.address = address
self.attack = int(attack)

def introduction(self):
print("姓名:{}".format(self.name))
print("年龄:{}".format(self.age))
print("性别:{}".format(self.sex))
print("地址:{}".format(self.address))

def attacked(self):
print(f"{self.name}正在向您发起攻击,攻击力为{self.attack}!")

def foreign_fun():
print("我是外部函数")

1.hasattr-オブジェクトに指定された属性またはメソッドが含まれているかどうかを確認します

Usage:

hasattr(object ,name)

関数: オブジェクトに指定された属性またはメソッドが含まれているかどうかを確認します。

戻り値: 存在する場合は true、存在しない場合は false を返します

# 实例化meeting类
Meeting = Meeting("张三", 20, "男", "南京", 108)

# 获取Meeting对象中是否存在name属性
print(hasattr(Meeting, "name"))# True
# 获取Meeting对象中是否存在mobile属性
print(hasattr(Meeting, "mobile"))# False
# 获取Meeting对象中是否存在attacked方法
print(hasattr(Meeting, "attacked"))# True

2 .getattr - オブジェクト内の指定された属性の属性値を取得します。

使用法:

getattr(object,name[,default])

関数: 属性値を取得します。オブジェクト内の指定された属性の

#戻り値: If 存在する場合はその属性の属性値が返され、存在しない場合は指定された内容が返されます

# 实例化meeting类
Meeting = Meeting("张三", 20, "男", "南京", 108)

# 获取Meeting对象中name属性的属性值
print(getattr(Meeting, "name"))# 张三
# 获取Meeting对象中kills属性或方法的值,若不存在则返回指定内容
print(getattr(Meeting, "kills", "未找到kills方法或属性"))# 未找到kills方法或属性
# 获取Meeting对象中attacked方法,返回值为函数地址
print(getattr(Meeting, "attacked"))
# 使用getattr方法可以直接调用Meeting对象中的方法
f = getattr(Meeting, "attacked")
f()

印刷結果は次のとおりです:

Python オブジェクト指向プログラミング - 初級

3.setattr-为object对象的name属性设置指定value

用法:

setattr(object,name,value)

作用:为object对象的指定属性设置指定value

返回值:

# 实例化meeting类
Meeting = Meeting("张三", 20, "男", "南京", 108)

# 将对象中name属性的值改为“刘德华”
setattr(Meeting, "name", "刘德华")
# 获取对象中name的属性值
print(getattr(Meeting, "name"))# 刘德华
# 将对象外部的名为foreign_fun的方法引入对象内部,并重新命名为“new_foreign_fun”
setattr(Meeting, "new_foreign_fun", foreign_fun)
# 获取对象中是否存在foreign_fun的属性或方法,返回值为True或False
print(hasattr(Meeting, "foreign_fun"))# False
# 获取对象中是否存在new_foreign_fun的属性或方法,返回值为True或False
print(hasattr(Meeting, "new_foreign_fun"))# True

打印结果如下:

Python オブジェクト指向プログラミング - 初級

四、魔法方法

1.__init__() 构造函数

__init__()方法是Python中一种特殊的方法,被称为构造函数或初始化方法,当创建这个类的实例时就会调用该方法。

class Meeting(object):
"""meeting类的类描述"""

def __init__(self, name, age, sex, address, attack):
"""构造函数"""
self.name = name
self.age = int(age)
self.sex = sex
self.address = address
self.attack = int(attack)

C = Meeting("张三", 20, "男", "南京", 108)
print(C.name)# 张三
print(C.address)# 南京

2.__del__() 析构函数

当删除对象时,Python解释器会默认调用一个方法__del__(),相当于unittest框架中的tearDown()函数

def __del__(self): 
"""析构函数""" 
print("%s攻击结束" % (self.name)) 

每调用一次对象,都会执行一次__del__()方法

Python オブジェクト指向プログラミング - 初級

3.引用计数

D = Meeting("张三", 20, "男", "南京", 108)
# 计算当前实例引用计数,D引用一次,sys.getrefcount(D)引用一次
print(sys.getrefcount(D))# 2

D对象的引用计数为2次,一次是D引用,一次是sys.getrefcount所引用的

4.__str()__字符串函数

__str__方法需要返回一个字符串,当做这个对象的描述信息,当使用print输出对象的时候,只要定义了__str__(self)方法,那么就会打印这个方法返回的数据

def __str__(self):
"""字符串函数"""
return "我是Meeting类的字符串描述"
# __str__():字符串函数,定义__str__()方法时,打印对象,打印的是__str__()方法的返回值,否则打印类的内存地址
print(D)# 我是Meeting类的字符串描述
  • 未定义__str__()方法时,打印对象,打印的是Meeting类的内存地址:<__main__.meeting object at0x014a7748>
  • 定义了__str__()方法后,打印对象,打印的是__str__()方法的返回值:我是Meeting类的字符串描述

五、Python的内置属性

1.__dict__:获取类的属性

获取类的属性,包含一个字典,由类的数据属性组成

# __dict__:获取类的属性,返回值为字典类型 
print(D.__dict__) 
# {'name': '张三', 'age': 20, 'sex': '男', 'address': '南京', 'attack': 108} 

2.__doc__:获取类的文档字符串

class Meeting(object): 
 """meeting1类的类描述""" 
 
# __doc__:获取类的文档字符串 
print(D.__doc__) # meeting1类的类描述 

3.__name__:获取类名

# __name__:获取类名 
print(Meeting.__name__) # Meeting 

4.__module__:类定义所在的模块

类的全名是'__main__.clssName',如果类位于一个导入模块mymod中,那么className.__module__等于mymod

from common.http_requests import HttpRequests
# __module__:类定义所在的模块
print(Meeting.__module__)# __main__
print(HttpRequests.__module__)# common.http_requests

Meeting类的路径为__main__,而从common文件的http_requests文件中导入了HttpRequests类,打印其路径,则为common.http_requests

5.__bases__:获取类的所有父类构成元素

获取类的所有父类构成元素(包含了一个由所有父类元素组成的元组)。例如下面有一个Song类,其继承了父类Music,则获取到的Song类的所有父类构成元素为:(,)

class Music(object):
pass

class Song(Music):
pass

print(Song.__bases__)# (<class '__main__.Music'>,)

小结

本篇文章我们介绍了面向对象的相关概念,下面来简单总结一下:

面向对象相关概念:

  • 类和对象:类是一类事物,对象即是这一类事物的具体实现,类具有相同的属性和行为;
  • 类的组成:类名、属性、方法
  • 带object的为新式类,不带object的为经典类

获取或添加对象属性:

  • hasattr:检查对象是否包含指定属性或方法
  • getattr:获取对象中指定属性的属性值
  • setattr:为object对象的name属性设置指定value

魔法方法:

  • __init__() 构造函数:又叫初始化方法,用来初始化一些成员变量
  • __del__() 析构函数:每调用一次对象,都会执行一次__del__()方法,相当于Unittest框架中的tearDown
  • __str()__字符串函数:返回一个字符串,当做这个对象的描述信息

Python内置属性:

  • __dict__:获取类的属性,返回值为字典类型
  • __doc__:获取类的文档字符串
  • __name__:获取类名
  • __module__:类定义所在的模块
  • __bases__:获取类的所有父类构成元素,返回类型为元组

以上がPython オブジェクト指向プログラミング - 初級の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事は51cto.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。