私有化:x:単一前置下線、プライベート属性またはメソッドxx:二重前置き下線;_xx__:二重前後下線属性property

10427 ワード

私有化
  • xx:公有変数
  • _x:単一の前置き下線、プライベート属性またはメソッド、from somemodule import*はインポートを禁止し、クラスオブジェクトとサブクラスは
  • にアクセスできます.
  • __xx:二重前置き下線で、サブクラスの属性命名と衝突しないようにし、外部から直接アクセスできない(名前が変更されたのでアクセスできない)
  • __xx__:二重前後下線、ユーザー名空間の魔法オブジェクトまたは属性.例:__init__,_自分でこのような名前を発明しないでください.
  • xx_:Pythonキーワードとの競合を回避するための下線
    name mangling(名前の変更(サブクラスがベースクラスを誤って書き換えないようにするための方法または属性)では、次のようになります.Class__object)メカニズムでprivateにアクセスできます.
    #coding=utf-8
    
    class Person(object):
        def __init__(self, name, age, taste):
            self.name = name
            self._age = age 
            self.__taste = taste
    
        def showperson(self):
            print(self.name)
            print(self._age)
            print(self.__taste)
    
        def dowork(self):
            self._work()
            self.__away()
    
    
        def _work(self):
            print('my _work')
    
        def __away(self):
            print('my __away')
    
    class Student(Person):
        def construction(self, name, age, taste):
            self.name = name
            self._age = age 
            self.__taste = taste
    
        def showstudent(self):
            print(self.name)
            print(self._age)
            print(self.__taste)
    
        @staticmethod
        def testbug():
            _Bug.showbug()
    
    #       , from  cur_module import * ,   
    class _Bug(object):
        @staticmethod
        def showbug():
            print("showbug")
    
    s1 = Student('jack', 25, 'football')
    s1.showperson()
    print('*'*20)
    
    #    __taste,    
    #s1.showstudent() 
    s1.construction('rose', 30, 'basketball')
    s1.showperson()
    print('*'*20)
    
    s1.showstudent()
    print('*'*20)
    
    Student.testbug()

    まとめ
  • 親クラスの属性名が__ の場合、子クラスは継承せず、子クラスは
  • にアクセスできません.
  • 子クラスで__ に値を割り当てると、子クラスで定義する親と同じ名前の属性
  • が定義される.
  • _ の変数、関数、クラスはfrom xxx import *を使用するも
  • に導入されない.
    属性property
    1.プライベート属性getterとsetterメソッドを追加する.propertyを使用してgetterとsetterメソッドをアップグレードする
    class Money(object):
        def __init__(self):
            self.__money = 0
    
        def getMoney(self):
            return self.__money
        def setMoney(self,value):
            if isinstance(value,int):
                self.__money = value
            else:
                print("error:      ")
        money = property(getMoney,setMoney)

    実行結果:
    In [1]: from get_set import Money
    
    In [2]: 
    
    In [2]: a = Money()
    
    In [3]: 
    
    In [3]: a.money
    Out[3]: 0
    
    In [4]: a.money = 100
    
    In [5]: a.money
    Out[5]: 100
    
    In [6]: a.getMoney()
    Out[6]: 100

    2、getterとsetterの代わりにpropertyを使用する方法@propertyは属性関数となり,属性付与時に必要な検査を行い,コードの明瞭さと短さを保証し,主に2つの役割を果たす.
  • メソッドを読み取り専用
  • に変換
  • は、境界判定
  • を行うことができる属性の設定と読み出し方法を再実現する.
    #!/usr/bin/env python3
    # -*- coding:utf-8 -*-
    #  @Time: 2020/6/27 15:35
    #  @Author:zhangmingda
    #  @File: property_study.py
    #  @Software: PyCharm
    #  Description:
    
    class Money(object):
        def __init__(self):
            self.__money =0
        
        @property
        def money(self):
            return self.__money
        @money.setter
        def money(self,value):
            if isinstance(value,int):
                self.__money = value
            else:
                print('error:       ')

    実行結果
    >>> from property_study import Money
    >>> m = Money()
    >>> m.money
    0
    >>> m.money= 199
    >>> m.money
    199
    >>> m.money= "a"
    error:       
    >>>