ホームページ >バックエンド開発 >Python チュートリアル >クラスのパブリック プロパティの概要

クラスのパブリック プロパティの概要

巴扎黑
巴扎黑オリジナル
2017-07-17 15:58:061577ブラウズ

1. 概念

クラスのプライベート属性については前述しましたが、これはクラス内で直接アクセスできない属性です。しかし、直接アクセスできるプロパティが公共プロパティである場合はどうなるでしょうか?あまり。 __init__() コンストラクターのプロパティは基本的に外部からアクセスできますが、パブリック プロパティではありません。では、パブリック属性とは何でしょうか?

定義: パブリック属性と呼ばれる、このクラスに属するすべてのオブジェクトがアクセスできる属性を指します。

2. 属性

2.1 メンバー属性

class Person(object):

    def __init__(self, name, job, phone, address):
        self.name = name    #  成员属性,属于某个实例对象
        self.job = job
        self.phone = phone
        self.__address = address

    def get_private(self):
        return self.__address

    def sayhi(self):
        print("hell,%s" % self.name)

p1 = Person('Bigberg', 'Doctor', '8833421', 'hz')
p2 = Person('Ashlex', 'Police', '8833232', 'bj')
print(p1.job, p2.job)

# 输出
Doctor Police

Person クラスの下に 2 つのオブジェクト p1 と p2 を定義しました。明らかに、p1 が p2 のジョブ属性、つまり警察にアクセスする方法はありません。そして、コンストラクター __init__() 内の self.name などの属性はメンバー属性と呼ばれます。

2.2 パブリック属性

class Person(object):
    nationality = 'CN'   # 定义公有属性

    def __init__(self, name, job, phone, address):
        self.name = name
        self.job = job
        self.phone = phone
        self.address = address

    def sayhi(self):
        print("hell,%s" % self.name)

p1 = Person('Bigberg', 'Doctor', '8833421', 'hz')
p2 = Person('Ashlex', 'Police', '8833232', 'bj')

print(p1.nationality)
print(p2.nationality)

# 输出

CN
CN

パブリック属性に関する限り、それにアクセスするすべてのインスタンスオブジェクトによって取得される値は同じです。

3. パブリック属性の特徴

パブリック属性にはアクセスするだけでなく、変更することもできます。

class Person(object):
    nationality = 'CN'   # 定义公有属性

    def __init__(self, name, job, phone, address):
        self.name = name
        self.job = job
        self.phone = phone
        self.address = address

    def sayhi(self):
        print("hell,%s" % self.name)

p1 = Person('Bigberg', 'Doctor', '8833421', 'hz')
p2 = Person('Ashlex', 'Police', '8833232', 'bj')

print(Person.nationality)  # 调用 公有属性
Person.nationality = 'us'   # 改变 公有属性
print(Person.nationality)

#输出

CN 
us

3.1 単一インスタンスのパブリックプロパティの呼び出しと変更

# 依据上例

print("--------Befoer change---------")
print(Person.nationality)
print(p1.nationality)
print(p2.nationality)

print("--------after change---------")
print(Person.nationality)
p1.nationality = 'JP'
print(p1.nationality)
print(p2.nationality)


# 输出

--------変更前--------
CN
CN
CN
-- ------変更後---------
US
JP
US

変更前のp1はよく理解できます。なぜなら、誰もがクラス Person の public 属性の国籍を呼び出しているからです。 p1 と p2 の国籍属性は同じで、両方とも「CN」です。しかし、p1 が public 属性を変更した後、p2 の国籍属性が変更されなかったのはなぜでしょうか。 Person クラスを定義するとき、それは実際にはすでにメモリ内に存在しており、当然、このクラスの public 属性も含まれています。初期インスタンス p1 がクラス person の国籍属性を呼び出すとき、国籍という新しい属性を追加するのではなく、クラス内の国籍のメモリ アドレスを直接参照します。

以下に示すように:

print(id(Person.nationality))
print(id(p1.nationality))
print(id(p2.nationality))
print(Person.nationality, p1.nationality, p2.nationality)

#输出
1751236836128
1751236836128
1751236836128
CN CN CN

これは、なぜ Person クラスの国籍が「US」に変更されると、p2 も変更されるのかを説明できます。メモリ内の値を直接参照するためです。

p1.nationality = 'JP'

p1がnationality属性を直接割り当てた後、インスタンスp1は実際にnationalityと呼ばれる自分自身の新しいメンバー変数を追加します。名前が同じというだけで、両者に関連性はなく、メモリアドレスすら異なります。

# p1.nationality = 'JP'
print(id(Person.nationality))
print(id(p1.nationality))
print(id(p2.nationality))
print(Person.nationality, p1.nationality, p2.nationality)

#输出
2434579585096
2434579585152
2434579585096
US JP US
つまり、p1.nationality='JP'は、 Person クラスのパブリック属性を変更するのではなく、それ自体の新しいメンバー属性を作成するため、p1の変更はクラスのパブリック属性に影響を与えません。

以上がクラスのパブリック プロパティの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。