私有化:x:単一前置下線、プライベート属性またはメソッドxx:二重前置き下線;_xx__:二重前後下線属性property
10427 ワード
私有化 xx:公有変数 _x:単一の前置き下線、プライベート属性またはメソッド、from somemodule import*はインポートを禁止し、クラスオブジェクトとサブクラスは にアクセスできます. __xx:二重前置き下線で、サブクラスの属性命名と衝突しないようにし、外部から直接アクセスできない(名前が変更されたのでアクセスできない) __xx__:二重前後下線、ユーザー名空間の魔法オブジェクトまたは属性.例: xx_:Pythonキーワードとの競合を回避するための下線
name mangling(名前の変更(サブクラスがベースクラスを誤って書き換えないようにするための方法または属性)では、次のようになります.Class__object)メカニズムでprivateにアクセスできます.
まとめ 親クラスの属性名が にアクセスできません.子クラスで が定義される. に導入されない.
属性property
1.プライベート属性getterとsetterメソッドを追加する.propertyを使用してgetterとsetterメソッドをアップグレードする
実行結果:
2、getterとsetterの代わりにpropertyを使用する方法メソッドを読み取り専用 に変換は、境界判定 を行うことができる属性の設定と読み出し方法を再実現する.
実行結果
__init__
,_自分でこのような名前を発明しないでください.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:
>>>