2012-07-14 177 views
18

可能重複:
Making a method private in a python subclass
Private Variables and Methods in Python受保護的方法

我如何定義在被保護,只有子類可以看到一個Python類的方法?

這是我的代碼:

class BaseType(Model): 
    def __init__(self): 
     Model.__init__(self, self.__defaults()) 


    def __defaults(self): 
     return {'name': {}, 
       'readonly': {}, 
       'constraints': {'value': UniqueMap()}, 
       'cType': {} 
     } 


    cType = property(lambda self: self.getAttribute("cType"), lambda self, data:    self.setAttribute('cType', data)) 
    name = property(lambda self: self.getAttribute("name"), lambda self, data: self.setAttribute('name', data)) 
    readonly = property(lambda self: self.getAttribute("readonly"), 
         lambda self, data: self.setAttribute('readonly', data)) 

    constraints = property(lambda self: self.getAttribute("constraints")) 

    def getJsCode(self): 
     pass 

    def getCsCode(self): 
     pass 


    def generateCsCode(self, template=None, constraintMap=None, **kwargs): 
     if not template: 
      template = self.csTemplate 

     if not constraintMap: constraintMap = {} 
     atts = "" 

     constraintMap.update(constraintMap) 

     for element in self.getNoneEmptyAttributes(): 
      if not AbstractType.constraintMap.has_key(element[0].lower()): 
       continue 
      attTemplate = Template(AbstractType.constraintMap[element[0].lower()]['cs']) 
      attValue = str(element[1]['value']) 
      atts += "%s " % attTemplate.substitute({'value': attValue}) 

     kwargs.update(dict(attributes=atts)) 

     return template.substitute(kwargs) 



class MainClass(BaseType, Model): 
    def __init__(self): 
     #Only Model will initialize 
     Model.__init__(self, self.__defaults()) 
     BaseType.__init__(self) 

    def __defaults(self): 
     return {'name': {}, 
       'fields': {'value': UniqueMap()}, 
       'innerClass': {'value': UniqueMap()}, 
       'types': {} 
     } 

    fields = property(lambda self: self.getAttribute("fields")) 
    innerClass = property(lambda self: self.getAttribute("innerClass")) 
    types = property(lambda self: self.getAttribute("types")) 


    @staticmethod 
    def isType(iType): 
    #  return type(widget) in WidgetSelector.widgets.itervalues() 
     return isinstance(iType, AbstractType) 

    def addType(self, type): 
     if not MainClass.isType(type): 
      raise Exception, "Unknown widget type %s" % type 
     self.types[type.name] = type 

我想那只是BaseType子看到的BaseTypegenerateCsCode方法。

+0

@jamylak否否否否否我只想說如何定義受保護的方法,我知道下劃線 – Pooya 2012-07-14 11:44:53

+0

爲什麼減去???爲什麼?這是我的問題,我搜索了很多,我沒有找到任何東西 – Pooya 2012-07-14 11:46:08

+1

@Pooya:你有你的答案:你不用Python做這個。描述更大的問題,我們可以幫助您找到適合Python的解決方案。 – 2012-07-14 11:47:13

回答

55

Python不支持C++/Java/C#的訪問保護。一切都是公開的。格言是,「我們都是大人。」記錄您的課程,並堅持讓您的合作者閱讀並遵守文檔。

Python中的文化是,以下劃線開頭的名字表示「除非你真的知道你應該使用這些名稱」。你可以選擇用下劃線開始你的「保護」方法。但請記住,這只是一個約定,它不會改變如何訪問該方法。

以雙下劃線(__name)開頭的名稱被破壞,因此可以構建繼承層次結構而不用擔心名稱衝突。有些人將這些用於「私人」方法,但同樣,它不會改變如何訪問該方法。

最好的策略是適應一個模型,在該模型中必須編寫單個進程中的所有代碼才能相處。

+0

是的我知道_和__但我想知道如何使我的方法受保護,就像在java中保護一樣。 – Pooya 2012-07-14 11:47:24

+29

答案非常簡單,並且已經提供:您不能在Python中。 – 2012-07-14 11:47:47

10

你不行。 Python有意不支持訪問控制。按照慣例,以下劃線開頭的方法是私有的,你應該在文檔中明確說明誰應該使用該方法。

+3

按照慣例,一個下劃線被認爲是受保護的,兩個下劃線被認爲是私人的。 – 2016-08-17 14:09:42

+0

@l__flex__l:實例屬性的雙引號下劃線調用具有非常特定語義的名稱調整。這不是一個慣例,它是語言定義的一部分。根據PEP 8,一個主要的下劃線是一個「弱的內部使用指標」。我認爲沒有任何有用的類比C++「受保護」和「私人」訪問修飾符。 – 2016-08-22 10:37:46

+3

在PEP 8中查看「爲繼承設計」部分。特別是以「另一類屬性開頭的段落是屬於」子類API「(通常在其他語言中稱爲」**「保護**)的那些屬性。對我而言,該部分描述了受保護的屬性。還有很多人相信[像這個人一樣](http://radek.io/2011/07/21/private-protected-and-public-in-python/)。我知道互聯網上的文章從來不是一個證明。但是,足夠的人對此表示贊同,因此根據定義,這是一個慣例,不是嗎? – 2016-08-28 11:26:46