Python-保護、継承、マルチステート
5986 ワード
1.7. 保護、継承、マルチステート
1.プライベート・オブジェクトと属性: Pythonには、C++のpublicやprivateのようなキーワードがなく、公有およびプライベート属性メソッド を定義しています.属性名で区別する方法であり、属性名の前に2つのスライド線 である.
例:
結果:
オブジェクトを作成すると、python解釈器はinit()メソッドをデフォルトで呼び出します.
オブジェクトを削除するとpython解釈器もデフォルトでdel()メソッドとしてメソッドを呼び出します.オブジェクトの参照を1つの変数で保存すると、そのオブジェクトの参照カウントに1 が加算されます. delを使用して変数が指すオブジェクトを削除する場合、オブジェクトの参照カウントが1、例えば3でない場合、この参照カウントは1だけ減算され、2になります.delを再度呼び出すと、1になります.delをもう一度呼び出すと、本当に になります.
例1では、1つを削除し、1つを残します.
結果は次のとおりです.
例2、削除済み:
結果は次のとおりです.
測定オブジェクト参照個数
sysモジュールを導入しsysを使用する必要がある.getrefcount(オブジェクト)は、呼び出し時にパラメータが渡され、1つ増えたため、測定された個数が実際の個数より1つ多い.
結果は次のとおりです.
最後の行の検査の時すでになくなって、だから間違いを報告することができます
3.継承
例:
結果は次のとおりです.サブクラスは、親の をデフォルトで実行することができる.子クラス継承時、クラスを定義する際、カッコ()は親クラスの名前 となる.親の属性とメソッドは、子 に継承されます.
注意*プライベート属性は、オブジェクトを介して直接アクセスすることはできませんが、メソッドを介して*プライベートメソッドにアクセスできます.オブジェクトを介して*プライベート属性、メソッドに直接アクセスできません.クラスに継承されたり、アクセスされたりすることはできません.親のみがプライベート属性とメソッドにアクセスするメソッドを提供します.サブクラスは、このメソッドを介してプライベート属性とメソッドにアクセスします*一般的には、私有の属性、方法はすべて対外的に公表しないので、往々にして内部の事をして、安全な作用を果たすことができます
書き換える
書き換えとは、子クラスに親と同じ名前のメソッドがあり、子クラスのメソッドは親クラスの同じ名前のメソッドを上書きします.
親を呼び出す方法:
結果は次のとおりです.
4.マルチ継承
マルチ継承の場合、同じメソッド呼び出し順序は
結果は次のとおりです.
5.マルチステート
6.クラス属性、インスタンス属性
結果は次のとおりです.
7.クラスメソッド、静的メソッド、
結果は次のとおりです.
1.プライベート・オブジェクトと属性:
__
を加えるとプライベート属性であることを示すが、そうでない場合は公有属性であり、方法も同様の例:
class Msg:
def __init__(self,money):
#
self.__money=money
def getMoney(self):
return self.__money
#
def __sendMsg(self):
print("--- --")
def sendMsg(self):
if(self.getMoney()>100):
self.__sendMsg()
else:
print(" ")
msg=Msg(1000)
print(msg.getMoney())
msg.sendMsg()
結果:
1000
--- --
2.__del()__
方法オブジェクトを作成すると、python解釈器はinit()メソッドをデフォルトで呼び出します.
オブジェクトを削除するとpython解釈器もデフォルトでdel()メソッドとしてメソッドを呼び出します.
例1では、1つを削除し、1つを残します.
class Dog:
def __del__(self):
print("over")
dog=Dog()
dog1=dog
del dog
print("=======")
結果は次のとおりです.
=======
over
例2、削除済み:
class Dog:
def __del__(self):
print("over")
dog=Dog()
dog1=dog
del dog
del dog1
print("=======")
結果は次のとおりです.
over
=======
測定オブジェクト参照個数
sysモジュールを導入しsysを使用する必要がある.getrefcount(オブジェクト)は、呼び出し時にパラメータが渡され、1つ増えたため、測定された個数が実際の個数より1つ多い.
import sys
class Dog:
def __del__(self):
print("over")
dog=Dog()
dog1=dog
print(sys.getrefcount(dog))
del dog
print(sys.getrefcount(dog1))
del dog1
print(sys.getrefcount(dog1))
結果は次のとおりです.
3
2
over
Traceback (most recent call last):
File "/home/shushu/PycharmProjects/pylearn35/del .py", line 12, in
print(sys.getrefcount(dog1))
NameError: name 'dog1' is not defined
最後の行の検査の時すでになくなって、だから間違いを報告することができます
3.継承
例:
# , :
class Cat(object):
def __init__(self, name, color=" "):
self.name = name
self.color = color
def run(self):
print("%s-- "%self.name)
# , Cat :
class Bosi(Cat):
def setNewName(self, newName):
self.name = newName
def eat(self):
print("%s-- "%self.name)
bs = Bosi(" ")
print('bs :%s'%bs.name)
print('bs :%s'%bs.color)
bs.eat()
bs.setNewName(' ')
bs.run()
結果は次のとおりです.
bs :
bs :
--
--
__init__
メソッド注意*プライベート属性は、オブジェクトを介して直接アクセスすることはできませんが、メソッドを介して*プライベートメソッドにアクセスできます.オブジェクトを介して*プライベート属性、メソッドに直接アクセスできません.クラスに継承されたり、アクセスされたりすることはできません.親のみがプライベート属性とメソッドにアクセスするメソッドを提供します.サブクラスは、このメソッドを介してプライベート属性とメソッドにアクセスします*一般的には、私有の属性、方法はすべて対外的に公表しないので、往々にして内部の事をして、安全な作用を果たすことができます
書き換える
書き換えとは、子クラスに親と同じ名前のメソッドがあり、子クラスのメソッドは親クラスの同じ名前のメソッドを上書きします.
親を呼び出す方法:
class Cat(object):
def sayHello(self):
print("halou-----1")
class Bosi(Cat):
def sayHello(self):
print("halou-----2")
#
Cat.sayHello(self)
#
super().sayHello()
a=Bosi();
a.sayHello()
結果は次のとおりです.
halou-----2
halou-----1
halou-----1
4.マルチ継承
マルチ継承の場合、同じメソッド呼び出し順序は
.__mro__
で表示できます.class base(object):
def test(self):
print('----base test----')
class A(base):
def test(self):
print('----A test----')
#
class B(base):
def test(self):
print('----B test----')
# , A、B
class C(A,B):
pass
obj_C = C()
obj_C.test()
print(C.__mro__) # C
結果は次のとおりです.
----A test----
(, , , , )
5.マルチステート
class Dog(object):
def print_self(self):
print("Dog")
class Xiaotq(Dog):
def print_self(self):
print("Xiaotq")
def introduce(temp):
temp.print_self()
dog=Dog()
xiaotq=Xiaotq()
introduce(dog)
introduce(xiaotq)
6.クラス属性、インスタンス属性
class Dog(object):
age=0
__name="tom"
def __init__(self,color):
self.color=color
dog=Dog(" ")
print(dog.age)
print(Dog.age)
# print(Dog.__name)
print(dog.color)
print("---------------------")
dog.age=1#
print(dog.age)#
print(Dog.age)#
print("---------------------")
Dog.age=1# ,
print(dog.age)
print(Dog.age)
print("---------------------")
del dog.age
print(dog.age)
print(Dog.age)
結果は次のとおりです.
0
0
---------------------
1
0
---------------------
1
1
---------------------
1
1
7.クラスメソッド、静的メソッド、
class Dog(object):
age=0
__name="tom"
def __init__(self,color):
self.color=color
# , @classmethod , , , cls
@classmethod
def addAge(cls):
cls.age+=10
# @staticmethod ,
@staticmethod
def msg():
print("+---------+")
print("| Dog |")
print("+---------+")
dog=Dog(" ")
Dog.msg()
dog.msg()
print("------------------------")
dog.addAge()
print(dog.age)
print(Dog.age)
print("------------------------")
Dog.addAge()
print(dog.age)
print(Dog.age)
結果は次のとおりです.
+---------+
| Dog |
+---------+
+---------+
| Dog |
+---------+
------------------------
10
10
------------------------
20
20