2014-02-24 94 views
0

如何引用父類中的子類的屬性?如何訪問基類中的子類的「靜態」字段?

我想建立從類屬性的對象屬性:

class _CharField(models.CharField): 

    def __init__(self): 
     self.max_length = something.patterns_field[ 'max' ] 


class EmailField(_CharField): 
    patterns_field = PATTERNS.EMAIL 


class NameField(_CharField): 
    patterns_field = PATTERNS.NAME 

代替somethind__init__我想一個子類的類對象設置的一個領域子實例。我可以像我的例子那樣使用自我,但我認爲這不太正確。

如何更改我的代碼?

+2

您可以使用類名,如'C2.c' ... – l4mpi

+0

@ l4mpi在基類中的方法?當然? – sergzach

+5

在這兩種情況下,這是一個可怕的做法。家長應該不瞭解其子女(代碼中,而不是現實生活中)。 – Rainbolt

回答

1

你應該包括C在父類(雖然你不必你應該)

​​

在更新後的quesiton我覺得這回答

class _CharField(models.CharField): 
    def __init__(self): 
     #remember this calls with self as the child class 
     self.max_length = self.patterns_field[ 'max' ] 
     #or for equivelent of EmailField.patterns_field (assuming you dont know EmailField) refer to self.__class__ 
     self.max_length = self.__class__.patterns_field[ 'max' ] 
     #self.__class__ is the Class of the caller(in this case the child) 

自我是完全罰款用於讀取一個靜態變量,但是如果它已經更改了類,則可能無法獲得更新版本

例如

class _CharField(): 
    patterns_field = {"max":-1} 
    def __init__(self): 
     #remember this calls with self as the child class 
     self.max_length1 = self.patterns_field[ 'max' ] 
     #or for equivelent of EmailField.patterns_field (assuming you dont know EmailField) refer to self.__class__ 
     self.max_length2 = self.__class__.patterns_field[ 'max' ] 
     #self.__class__ is the Class of the caller(in this case the child)' 

class EmailField(_CharField): 
    patterns_field = {'max':16} 


class NameField(_CharField): 
    patterns_field = {'max':12} 

c = _CharField() 
print c.max_length1 # prints -1 
print c.max_length2 # prints -1 
e = EmailField() 
print e.max_length1 #prints 16 
print e.max_length2 #prints 16 

n=NameField() 
print n.max_length1 #prints 12 
print n.max_length2 #prints 12 
+0

謝謝你的回答!對不起,我的問題不清楚。現在我編輯了它。 – sergzach

+0

看到我的編輯.... –

1

也許你可以使用的方法如下

class Parent(object): 
    def __init__(self): 
    self.max_length = self._get_max_length() 

    def _get_max_length(self): 
    return None # or a value that would make more sense 

class Child(object): 
    def _get_max_length(self): 
    return self.exact_value 
+0

是的,我可以。但我想從**類**字段中獲取它,而不是來自**方法**,而不是來自**對象**字段。 – sergzach

相關問題