プライベート権限
カプセル化の意味:
属性とメソッドを全体としてまとめ、オブジェクトをインスタンス化して処理します。
内部実装の詳細を非表示にし、オブジェクトとその属性とメソッドを操作するだけで済みます。
属性とメソッドをクラスのアクセス制御に追加します。
プライベート権限:プロパティ名とメソッド名の前に2つのアンダースコアを追加します__
クラスのプライベートプロパティとプライベートメソッドにはオブジェクトから直接アクセスできませんが、クラス内でアクセスできます。クラス
のプライベートプロパティとプライベートメソッドサブクラスによって継承され、サブクラスはそれらにアクセスできません。
プライベートプロパティとプライベートメソッドは、セキュリティの役割を果たすオブジェクト処理ではなく、クラスの内部業務を処理するためによく使用されます。
出力結果:
実装コード:
class Person(object):
def __init__(self,name,score):
self.name = name
self.__score = score
def _primethod(self):
print("私有方法")
p = Person("Bob",59)
print(p.name)
print(p.__primethod)
クラス部門はプライベートプロパティとプライベートメソッドを呼び出します
デモ:プライベートメソッドとプライベートプロパティ
サブクラスは、インスタンスメソッドを介してプライベートプロパティとメソッドを呼び出しますが、直接呼び出すことはできません
。出力結果:
class Person(object):
def __init__(self,name,score):
self.name = name
self.__score = score
def __primethod(self):
print("私有方法")
def method(self):
return self.__score
def method1(self):
return self.__primethod()
p = Person("Bob",59)
print(p.method())
p.method1()
サブクラスは親クラスのプライベートプロパティとメソッドを継承できません
出力結果:
実装コード:
class Father(object):
def __init__(self,name):
self.name = name
self.__age = 19
def eat(self):
print("吃东西")
def __playPingPang(self):
print("喜欢玩乒乓球")
class Son(Father):
pass
son = Son("张三")
print(son.name)
print(son.__age)
概要:
1)クラス内からselfを介して呼び出すことができるが、オブジェクトを介してアクセスできないプライベートプロパティ
2)クラス内からselfを介して呼び出すことができるが、オブジェクトを介してアクセスできないプライベートメソッド
3)オブジェクトはprivate-privilegedプロパティとメソッドにアクセスできません
4)サブクラスは親クラスのprivateパーミッションのプロパティとメソッドを継承できません
5)Pythonには、publicとprivateのようなキーワードはなく、publicとprivateを区別するためにC++で保護されていますプライベート属性。
6)Pythonは、属性の命名によって区別されます。属性とメソッド名の前に2つのアンダースコア「__」が追加されている場合は、属性とメソッドがプライベート権限であることを示します。それ以外の場合は、パブリック権限です。
プライベートプロパティの値を変更する
出力結果:
実装コード:
class People(object):
def __init__(self):
self.__money = 1000
def set_money(self,money):
self.__money = money
def get_money(self):
return self.__money
p = People()
p.set_money(2000)
print(p.get_money())
概要:
最近のソフトウェア開発では、get_xxx()メソッドとset_xxx()メソッドは通常、プライベートプロパティ値を取得して変更するために定義されています
get_xxx()メソッド–>プライベートプロパティの値を返します
set_xxx()メソッド–>パラメーターを受け取り、変更しますプライベートプロパティの値値
オブジェクトは、プライベート権限のプロパティとメソッドにアクセスできません。パブリックメソッドset_money()にアクセスしてプライベートプロパティの値を変更でき、パブリックにアクセスしてプライベートプロパティの値を取得できます。メソッドget_money()。
クラスとインスタンスのプロパティ
クラス属性とインスタンス属性
クラスの基本を理解した後、Pythonでこれらの概念の違いを見てみましょう。
クラス属性とインスタンス属性について話しましょう。
前の例では、インスタンス属性(インスタンスオブジェクト属性)に触れました。 )。)、名前が示すように、クラス属性はクラスオブジェクトが所有する属性であり、クラスオブジェクトのすべてのインスタンスオブジェクトによって共有され、メモリ内にコピーが1つしかないため、静的なものと多少似ています。 C++のクラスのメンバー変数。パブリッククラスプロパティの場合、クラスまたはインスタンスオブジェクトを介してアクセスできます。
インスタンスプロパティは、クラスではなくオブジェクトを介してのみ呼び出すことができます。
出力結果:
実装コード:
class People(object):
name = 'Tom' # 公有的类属性
__age = 12 # 私有的类属性
p = People()
print(p.name) # 正确
print(People.name) # 正确
print(p.__age) # 错误,不能在类外通过实例对象访问私有的类属性
print(People.__age) # 错误,不能在类外通过类访问私有的类属性
クラスまたはインスタンスオブジェクトを介して呼び出すことができます(プライベートではありません)
インスタンスプロパティ(オブジェクトプロパティ)
出力結果:
実装コード:
class People(object):
address = "山东" #类属性
def __init__(self):
self.name = "小王" #实例属性
self.age = 20 #实例属性
p = People()
p.age = 12
print(p.address) #正确
print(p.name) #正确
print(p.age) #正确
print(People.address) #正确
print(People.name) #错误
print(People.age) #错误
オブジェクトをインスタンス化することで呼び出すことができますが、クラスは呼び出すことができません
クラスプロパティはインスタンス(オブジェクト)で変更できません
出力結果:
実装コード:
class People(object):
country = "china" #类属性
print(People.country)
p = People()
print(p.country)
p.country = "japan"
print(p.country)
p2 = People()
print(p2.country)
静的メソッドとクラスメソッド
- クラスメソッド
は、クラスオブジェクトが所有するメソッドであり、デコレータ@classmethodを使用してクラスメソッドとして識別する必要があります。クラスメソッドの場合、最初のパラメータはクラスオブジェクトである必要があり、通常はclsが最初のパラメータです。もちろん、他の名前を使用することもできます)最初のパラメーターとして変数を使用しますが、ほとんどの人は最初のパラメーターの名前として「cls」に慣れています。インスタンスオブジェクトからアクセスできる「cls」を使用することをお勧めします)とクラス名。
出力結果;
実装コード:
class People(object):
age = 18
# 类方法,用classmethod来进行修饰
@classmethod
def get_country(cls):
return cls.age
p = People()
print(p.get_country()) #可以通过实例对象引用
print(People.get_country()) #可以通过类名引用
クラスメソッドのもう1つの使用法は、クラスプロパティを変更することです。
出力結果:
実装コード:
class People(object):
# 类属性
age= 18
#类方法,用classmethod来进行修饰
@classmethod
def get_country(cls):
return cls.age
@classmethod
def set_country(cls,age):
cls.age = age
p = People()
print(p.get_country()) #可以用过实例对象访问
print(People.get_country()) #可以通过类访问
p.set_country(23)
print(p.get_country())
print(People.get_country())
p1 = People()
print(p1.get_country())
結果は、クラス属性がクラスメソッドで変更された後、クラス名とインスタンスオブジェクトを介したアクセスが変更されたことを示しています(すべての変更)
2.静的メソッド
デコレータ@staticmethodでデコレーションする必要があります。静的メソッドは複数のパラメータを定義する必要はなく、オブジェクトやクラスからアクセスできます。
出力結果:
実装コード:
class People(object):
country = "china"
@staticmethod
# 静态方法
def get_country():
return People.country
p = People()
#通过对象访问静态方法
print(p.get_country())
# 通过类访问静态方法
print(People.get_country())
静的メソッドで追加のパラメーターを定義する必要はなく、静的メソッドはオブジェクトまたはクラスを介して呼び出すことができます
3.インスタンスメソッド
インスタンスメソッドの最初のパラメータはselfであり、オブジェクトを介してのみアクセスできます。
出力結果:
実装コード:
class People(object):
def selfmethod(self):
print("我是实例方法")
p = People()
p.selfmethod()
People.selfmethod() #报错
インスタンスメソッドにはselfパラメータが必要であるため、インスタンスメソッドの呼び出しはインスタンスオブジェクトを介して呼び出す必要があります
概要:
クラスメソッドは@classmethodで装飾されており、最初のパラメーターはクラス(cls)であり、クラスのインスタンスまたはクラス自体から呼び出すことができます。
静的メソッドは@staticmethodで装飾されており、クラスのインスタンスまたはクラス自体を使用して呼び出すことができます。
インスタンスメソッドが定義されている場合、最初のパラメータはクラス(self)のインスタンスであり、呼び出されたときにインスタンスを介して呼び出す必要があります。
__new__メソッド
出力結果:
実装コード:
class A(object):
def __init__(self):
print("这是__init__方法")
def __new__(cls, *args, **kwargs):
print("这是__new__方法")
return object.__new__(cls)
a = A()
まとめ
1)__ new__には、インスタンス化されるクラスを表すパラメーターclsが少なくとも1つ必要です。このパラメーターは、インスタンス化中にPythonインタープリターによって自動的に提供されます。
2)。__ new__には戻り値があり、インスタンス化されたインスタンスを返す必要があります。__new__を自分で実装する場合は、この点に特に注意する必要があります。親クラス__new__からインスタンスを返すことも、オブジェクトの__new__を直接返すこともできます。
3)。__init__にはパラメータselfがあります。これは、この__new__によって返されるインスタンスです。__init__は__new__に基づいて他の初期化アクションを完了することができ、__init__は値を返す必要はありません。
4)メーカーと比較することができます。__ new__メソッドは原材料購入の初期段階であり、__init__メソッドは原材料に基づいて商品を処理および初期化することです。
シングルトンパターン
シングルトンモード:インスタンスを取得するために常に1つのオブジェクトを使用し、インスタンスを作成しすぎてリソースを浪費しないようにします。
エッセンス:__ new__メソッドを使用して新しいクラスオブジェクトを作成する場合は、最初にオブジェクトが作成されているかどうかを確認し、作成されているかどうかを確認します。既存のオブジェクトを使用します
出力結果:
実装コード:
class Foo(object):
instance = None
def __init__(self):
self.name = 'alex'
def __new__(cls):
if Foo.instance:
return Foo.instance
else:
Foo.instance = object.__new__(cls)
return Foo.instance
obj1 = Foo()
obj2 = Foo()
print(obj1,obj2)