Python3の基本(11)-属性とメソッドの民営化

1.クラス属性を変更します

办法1:类名.属性名=值
办法2:类名.方法(传入值)

2.属性と機能を非表示にします

2つのアンダースコアで始まる変数と関数は、非表示属性および非表示関数と呼ばれます。非表示の変数と関数は、クラスの外部ではなく、クラスの内部でのみ呼び出すことができます。プライベート属性値を外部から変更またはアクセスする必要がある場合は、外部呼び出し用にクラスにgetメソッドとsetメソッドを提供する必要があります。

class User:
#在创建类的时候,获取两个参数值,为私有变量赋值
def __init__(self, name, age):
self.__name = name
self.__age = age

#创建get方法,供类外部调用者获取参数值
def get_name(self):
return self.__name

def get_age(self):
return self.__age

#创建sett方法,供类外部调用者修改参数值
def set_name(self, name):
self.__name = name

def set_age(self, age):
self.__age = age

3.継承子
クラスは、人生における親と子の関係と同様に、親クラスの特性(属性と機能)を継承します。

class Animal:
def __init__(self):
self.color = "黄色"
def eat(self):
self.color = "黄色"
print("------吃饭------")
def sleep(self):
print("------睡觉------")
class Dog(Animal):    #继承于Animal类,单继承
def __init__(self, name):
self.__name = name
def bark(self):
print("------旺旺叫------")
class Cat(Animal):    #继承于Animal类
def catch(self):
print("------抓老鼠------")
dog = Dog()
dog.eat()    #子类可以调用父类的函数

ここで、属性の継承は関数の継承とは少し異なることに注意してください。サブクラスは、親クラスのグローバル変数を直接継承して呼び出すことはできません。このとき、親クラスのメソッドにパブリックグローバル変数が作成されます。このメソッドが子クラスでオーバーライドされていない場合、子クラスは親クラスのメソッドを呼び出します。このとき、オブジェクトが作成されます。この関数を介して。グローバル変数。この状況は属性の継承ではなく、メソッドの継承であるため、サブクラスオブジェクトは、実際に親クラス変数を継承するのではなく、メソッド呼び出しを通じて新しいサブクラスグローバル変数を取得します。上記の親クラスで作成されたcolor変数と同様に、子クラスDogは__init __()メソッドを書き換えます。したがって、Dogオブジェクトが作成されると、親クラスの__init __()メソッドは呼び出されないため、Dogオブジェクトは呼び出されません。それ自体のために作成された色属性。ただし、Catサブクラスは異なります。__init __()メソッドはオーバーライドされないため、Catオブジェクトが作成されると、親クラスの__init __()メソッドが自動的に呼び出され、作成されたCatオブジェクトにcolor属性が割り当てられます。このような属性は、オブジェクト属性またはインスタンス属性と呼ばれます。

4.多重継承
多重継承とは、複数の親クラスから同時に継承することを意味します。たとえば、ラバはロバや馬から受け継がれています。それは人生における親と子の関係に相当します。

class A:    #类没有指定继承关系的时候,默认是继承于object类
def test(self):
print("A------test()函数")
class B:
def test(self):
print("B------test()函数")
class C(A,B):
def test(self):
print("C------test()函数")
c = C()
print(C.__mro__)    #打印类C多继承调用的优先级关系,其实是跟继承的顺序有关系
c.test()    #调用c类自己的test()函数,因为自己重写了test()函数,如果没有重写此方法,那么则会调用下一个类的test()函数,而下一个类则是继承的类当中的第一个。

5.メソッドの書き換え
いわゆる書き換えとは、サブクラスに親クラスと同じ名前のメソッドがあり、サブクラスのメソッドが親クラスの同じ名前のメソッドをオーバーライドすることを意味します。
上記のポイント3と同様に、__ init __()メソッドが上書きされます。このメソッド自体はオブジェクトクラスのメソッドですが、子クラスDogが親クラスAnimalから継承する場合です。Animalによってオーバーライドされる__init __()メソッドはオブジェクトクラスのものであり、サブクラスDogによってオーバーライドされる__init __()メソッドは親クラスAnimalのものであり、オーバーライドするものも親クラスAnimalのものです。したがって、Dogクラスが初期化メソッドをオーバーライドする場合、サブクラスがオブジェクトを作成するときに、親クラスの初期化メソッドは呼び出されず、色変数値は取得されません。したがって、この場合でも親クラスのオーバーライドされたメソッドを実行できるようにする場合は、それをアクティブに呼び出す必要があります。

def __init__(self, name):
super().__init__()    #主动调用父类的初始化方法即可,这里因为父类没有参数,所以不用传参
self.__name = name

6.ポリモーフィズムとクラス属性
ポリモーフィズムはPythonの弱い型です。いわゆる強い型と弱い型は、変数を宣言するときに変数型が明示的に指定されているかどうかを示します。指定されている場合は強い型であり、変数型が明示的に指定されていない場合は弱い型です。Pythonは、型を指定しない弱い型です。

上記の継承で使用される属性は、インスタンス属性(オブジェクト属性)です。名前が示すように、クラス属性はクラスオブジェクトが所有する属性です。これらは、クラスオブジェクトのすべてのインスタンスオブジェクトによって共有されます。メモリ内のコピーは1つだけです。これはC ++と同じミドルクラスの静的メンバー変数は多少似ています。パブリッククラス属性の場合、クラスオブジェクトおよびクラス外のインスタンスオブジェクトを介してアクセスできます。
クラス属性:所属するクラス。このクラスの下にあるすべてのオブジェクトは、このクラス属性を共有できます。Javaの静的プロパティに相当します。Pythonでは、クラスで変数を直接宣言することは、パブリッククラス属性です。以下の名前など。

class User(object):
	name = "zhantao"#公共的类属性
	__password = "123456"#私有(隐藏)的类属性
	def __init__(self, sex, username):
		super(User, self).__init__()
		self.sex = sex#对象属性
		self.username = username#对象属性
 #self.name = username#name是对象属性,而不是修改全局的类属性,这个跟Java当中的是完全不一样。
		
u1 = User("男", "goldfish”)
print(u1.name)

u2 = User("女", "love)
print(u2.name)

print(User.name)
以上u1,u2两个对象打印出来的值和使用类名调用变量打印出来的值是一样的

u1.name = "ww"#这里仅仅是修改了u1对象里面的类属性,而没有修改类里面的属性。因为类属性是属于类的,而不是属于某个对象的,所以要修改则需要通过类名来修改。
User.name = "ww"#这才是真正修改了公共的类属性
del u1.name#本质上只是删除了对象u1的name属性,并没有删除类里面的属性

7.クラスメソッドクラスメソッドを
作成するには、パブリックメソッドに修飾子@classmethodを追加します。このメソッドは引き続き継承できます。

class User(object):
 name = "zs"
	@classmethod    #类方法一定要在方法的上面加上一个修饰器
	def name(cls):    #其中参数不是self,而是cls,cls代表的是类本身,而self代表的是对象本身
cls.name = "ww"    #因为cls代表类本身,所以可以通过这种方式来修改类属性,同User.name = "ww"是同样的效果
print("-------")
user = User()
user.name()
User.name()
以上调用的结果是一致的,同一个方法。

8.静的メソッド
静的メソッドは一種のクラスメソッドですが、修飾子が異なるため、クラスメソッドでもある@staticmethodを使用する必要があります。
違い:デフォルトではパラメータは渡されません。ここに渡すデフォルトのパラメーターがないという事実は、パラメーターがないことを意味するわけではありません。もちろん、正式なパラメーターはメソッドで定義することもできますが、クラスメソッドとは異なり、システムはいくつかのデフォルトのパラメーター(selfおよびcls)を自動的に渡します。 。ただし、パラメータを自分で定義したら、呼び出すときにパラメータを渡す必要があります。

class User(object):
	@staticmethod
	def age():
		User.name = "ww"    #在这里修改全局变量则需要使用类名了,没有默认的cls使用。

概要:
1。Pythonには、パブリック属性とプライベート属性を区別するためのC ++のpublicやprivateなどのキーワードがありません
。2。属性の命名によって区別されます。属性名の前に2つのアンダースコアが追加されている場合は、属性がプライベートであることを意味します。プロパティ、それ以外の場合はパブリックプロパティです(関数についても同じことが言えます)。パブリック属性には、クラス名またはオブジェクトを介してアクセスできます。
3.継承とは、親クラスのパブリックメソッドとパブリッククラスの属性を継承することだけです。
4. class属性はオブジェクトではなくクラスに属しているため、変更する場合は、クラス名を使用して変更する必要があります。
5.オブジェクトプロパティの名前がクラスプロパティの名前とまったく同じである場合、オブジェクト呼び出しを介して、それは呼び出されたオブジェクトプロパティであり、値はオブジェクトプロパティの値でもあります。パブリッククラス属性を使用する必要がある場合は、クラス名で呼び出す必要があります。(この点はJavaとは完全に異なります。)Pythonでは、オブジェクト属性とクラス属性は完全に分離されています。
6.パブリックメソッドとクラスメソッドのselfパラメータとclsパラメータの名前は自由に変更できますか?もちろん可能ですが、それは単なるパラメータ名ですが、その名前を見て意味を知る必要があるので、私たちは習慣的にselfを使用してオブジェクト自体を表し、clsを使用してクラス自体を表します。

著者:Cangshuipu魔女クラウド
ブログ:http//blog.csdn.NET/amir_zt/
よりオリジナル、ソースを示してください、ありがとう。
https://blog.csdn.net/amir_zt/article/details/84201777

おすすめ

転載: blog.csdn.net/u011635351/article/details/84201777