Sağlanan cevapların birçoğu mülk başına çok fazla satır gerektirir, yani / ve / veya - birden fazla mülk için gerekli tekrarlama nedeniyle çirkin veya sıkıcı bir uygulama olarak düşündüğüm, vb. artık ya da çok fazla amaca hizmet etmedikçe basitleştirilemez.
Kısacası: Tamamlanmış çalışmalarda, 2 satır kod tekrarlarsam, genellikle tek satır yardımcı işlevine dönüştürürüm ve benzeri ... (start_x, start_y, end_x, end_y) gibi matematik veya tek değişkenleri (x, y, w, h) yani x, y, x + w, y + h (bazen min / maks gerektiren veya w / h negatifse ve uygulama hoşlanmıyorsa, x / y ve abs w / h. vs ..).
Dahili alıcıları / ayarlayıcıları geçersiz kılmak gitmek için iyi bir yoldur, ancak sorun her sınıf için bunu yapmanız ya da sınıfı bu tabana vurgulmanız ... Bu benim için işe yaramıyor miras, çocuk düğümleri vb.İçin çocukları / ebeveynleri seçmekte serbesttir.
Verileri girmek için bir Dict veri türü kullanmadan soruya cevap veren bir çözüm oluşturdum.
Çözümüm, özellikleri eklemek istediğiniz sınıf için bir temel sınıf oluşturmak için sınıfınızın üzerine 2 ekstra satır eklemenizi, ardından 1 satır başına ve verileri kontrol etmek için geri arama ekleme, veri değişiklikleri olduğunda sizi bilgilendirme seçeneğiniz var. , değere ve / veya veri türüne göre ayarlanabilecek verileri ve çok daha fazlasını kısıtlayın.
Ayrıca _object.x, _object.x = değer, _object.GetX (), _object.SetX (değer) kullanma seçeneğiniz de vardır ve bunlar aynı şekilde işlenir.
Ayrıca, değerler sınıf örneğine atanan yalnızca statik olmayan verilerdir, ancak gerçek özellik sınıfa atanır, yani tekrarlamak istemediğiniz, tekrarlanması gerekmez ... varsayılan varsayılan değeri geçersiz kılma seçeneği olmasına rağmen, alıcı her seferinde ihtiyaç duymayacak şekilde varsayılan bir değer atayabilir ve başka bir seçenek de vardır, böylece alıcı varsayılan getirileri geçersiz kılarak ham depolanan değeri döndürür (not: bu yöntem ham değerin yalnızca bir değer atandığında atanmış olduğu anlamına gelir; aksi takdirde Yok - değer Sıfırlandığında, Yok, vb. atar.)
Çok sayıda yardımcı işlev de vardır - eklenen ilk özellik, örnek değerlerine başvurmak için sınıfa 2 veya daha fazla yardımcı ekler ... Tekrarlanan ResetAccessors (_key, ..) varargs (tümü, ilk adlandırılmış argümanlar kullanılarak tekrarlanabilir) ) ve SetAccessors (_key, _value) ile ana sınıfa verimlilikte yardımcı olmak için daha fazla ekleme seçeneği - planlananlar: erişimcileri bir arada gruplamanın bir yolu, bu nedenle her seferinde birkaç kez sıfırlama eğilimindeyseniz , her seferinde adlandırılmış tuşları tekrarlamak yerine bir gruba atayabilir ve grubu sıfırlayabilirsiniz.
Örnek / ham saklanan değer sınıfta saklanır . , sınıf. özelliğin statik değişkenlerini / değerlerini / işlevlerini tutan Accessor Sınıfına başvurur. _sınıf. ayar / alma vb. sırasında örnek sınıfı aracılığıyla erişildiğinde çağrılan özelliğin kendisidir.
Accessor _class .__ sınıfa işaret eder, ancak dahili olduğu için sınıfta atanması gerekir, bu yüzden atamak için __Name = AccessorFunc (...) kullanmayı seçtim, birçok isteğe bağlı özellik başına tek bir satır kullanılacak argümanlar (tanımlanması ve bakımı daha kolay ve verimli oldukları için anahtarlı varargs kullanarak) ...
Ayrıca, belirtildiği gibi, bazıları erişimci işlev bilgilerini kullanan çok sayıda işlev oluşturuyorum, bu yüzden çağrılmaya gerek yok (şu anda biraz rahatsız edici olduğu için - şu anda _class kullanmanız gerekiyor. .FunctionName (_class_instance) , args) - Bu bit maratonunu çalıştıran işlevleri ekleyerek veya nesneye erişimcileri ekleyerek ve kendini kullanarak (bunu belirtmek için adlandırılır) değeri değerlendirmek için örnek başvurusunu almak için yığın / iz kullanarak dolaştım örnek ve kendinize, AccessorFunc sınıf başvurusuna ve işlev tanımları içindeki diğer bilgilere erişimi korumak içindir).
Tamamen bitmedi, ama harika bir ayak tutun. Not: Özellikleri oluşturmak için __Name = AccessorFunc (...) kullanmıyorsanız, init işlevi içinde tanımlasam da __ tuşuna erişemezsiniz. Bunu yaparsanız, hiçbir sorun yoktur.
Ayrıca: Ad ve Anahtarın farklı olduğunu unutmayın ... Ad, İşlev Adı Oluşturma'da kullanılan 'resmi' ve anahtar veri depolama ve erişim içindir. yani _class.x küçük harf x anahtar ise, isim X büyük harf olur, böylece GetX () biraz tuhaf görünen Getx () yerine işlevdir. bu self.x'in çalışmasına ve uygun görünmesine izin verir, aynı zamanda GetX () 'e de izin verir ve uygun görünmesine izin verir.
Anahtar / ad aynı ve göstermek için farklı ile ayarlanmış bir örnek sınıf var. verilerin çıktısını almak için çok sayıda yardımcı işlev oluşturuldu (Not: Bunların hepsi tamamlanmadı), böylece neler olup bittiğini görebilirsiniz.
: X, name: X tuşlarını kullanarak geçerli işlev listesi şu şekilde çıktı verir:
Bu hiçbir şekilde kapsamlı bir liste değildir - gönderme sırasında bunu yapmayan birkaç kişi vardır ...
_instance.SetAccessors( _key, _value [ , _key, _value ] .. ) Instance Class Helper Function: Allows assigning many keys / values on a single line - useful for initial setup, or to minimize lines. In short: Calls this.Set<Name>( _value ) for each _key / _value pairing.
_instance.ResetAccessors( _key [ , _key ] .. ) Instance Class Helper Function: Allows resetting many key stored values to None on a single line. In short: Calls this.Reset<Name>() for each name provided.
Note: Functions below may list self.Get / Set / Name( _args ) - self is meant as the class instance reference in the cases below - coded as this in AccessorFuncBase Class.
this.GetX( _default_override = None, _ignore_defaults = False ) GET: Returns IF ISSET: STORED_VALUE .. IF IGNORE_DEFAULTS: None .. IF PROVIDED: DEFAULT_OVERRIDE ELSE: DEFAULT_VALUE 100
this.GetXRaw( ) RAW: Returns STORED_VALUE 100
this.IsXSet( ) ISSET: Returns ( STORED_VALUE != None ) True
this.GetXToString( ) GETSTR: Returns str( GET ) 100
this.GetXLen( _default_override = None, _ignore_defaults = False ) LEN: Returns len( GET ) 3
this.GetXLenToString( _default_override = None, _ignore_defaults = False ) LENSTR: Returns str( len( GET ) ) 3
this.GetXDefaultValue( ) DEFAULT: Returns DEFAULT_VALUE 1111
this.GetXAccessor( ) ACCESSOR: Returns ACCESSOR_REF ( self.__<key> ) [ AccessorFuncBase ] Key: x : Class ID: 2231452344344 : self ID: 2231448283848 Default: 1111 Allowed Types: {"<class 'int'>": "<class 'type'>", "<class 'float'>": "<class 'type'>"} Allowed Values: None
this.GetXAllowedTypes( ) ALLOWED_TYPES: Returns Allowed Data-Types {"<class 'int'>": "<class 'type'>", "<class 'float'>": "<class 'type'>"}
this.GetXAllowedValues( ) ALLOWED_VALUES: Returns Allowed Values None
this.GetXHelpers( ) HELPERS: Returns Helper Functions String List - ie what you're reading now... THESE ROWS OF TEXT
this.GetXKeyOutput( ) Returns information about this Name / Key ROWS OF TEXT
this.GetXGetterOutput( ) Returns information about this Name / Key ROWS OF TEXT
this.SetX( _value ) SET: STORED_VALUE Setter - ie Redirect to __<Key>.Set N / A
this.ResetX( ) RESET: Resets STORED_VALUE to None N / A
this.HasXGetterPrefix( ) Returns Whether or Not this key has a Getter Prefix... True
this.GetXGetterPrefix( ) Returns Getter Prefix... Get
this.GetXName( ) Returns Accessor Name - Typically Formal / Title-Case X
this.GetXKey( ) Returns Accessor Property Key - Typically Lower-Case x
this.GetXAccessorKey( ) Returns Accessor Key - This is to access internal functions, and static data... __x
this.GetXDataKey( ) Returns Accessor Data-Storage Key - This is the location where the class instance value is stored.. _x
Çıkarılan verilerin bazıları:
Bu, demo sınıfı kullanılarak oluşturulmuş yepyeni bir sınıf için, adından başka herhangi bir veri atanmamış (bu nedenle çıktı olabilir) ki bu da kullandığım değişken adı ...
_foo --- MyClass: ---- id( this.__class__ ): 2231452349064 :::: id( this ): 2231448475016
Key Getter Value | Raw Key Raw / Stored Value | Get Default Value Default Value | Get Allowed Types Allowed Types | Get Allowed Values Allowed Values |
Name: _foo | _Name: _foo | __Name.DefaultValue( ): AccessorFuncDemoClass | __Name.GetAllowedTypes( ) <class 'str'> | __Name.GetAllowedValues( ) Saved Value Restrictions Levied by Data-Type |
x: 1111 | _x: None | __x.DefaultValue( ): 1111 | __x.GetAllowedTypes( ) (<class 'int'>, <class 'float'>) | __x.GetAllowedValues( ) Saved Value Restrictions Levied by Data-Type |
y: 2222 | _y: None | __y.DefaultValue( ): 2222 | __y.GetAllowedTypes( ) (<class 'int'>, <class 'float'>) | __y.GetAllowedValues( ) Saved Value Restrictions Levied by Data-Type |
z: 3333 | _z: None | __z.DefaultValue( ): 3333 | __z.GetAllowedTypes( ) (<class 'int'>, <class 'float'>) | __z.GetAllowedValues( ) Saved Value Restrictions Levied by Data-Type |
Blah: <class 'int'> | _Blah: None | __Blah.DefaultValue( ): <class 'int'> | __Blah.GetAllowedTypes( ) <class 'str'> | __Blah.GetAllowedValues( ) Saved Value Restrictions Levied by Data-Type |
Width: 1 | _Width: None | __Width.DefaultValue( ): 1 | __Width.GetAllowedTypes( ) (<class 'int'>, <class 'bool'>) | __Width.GetAllowedValues( ) Saved Value Restrictions Levied by Data-Type |
Height: 0 | _Height: None | __Height.DefaultValue( ): 0 | __Height.GetAllowedTypes( ) <class 'int'> | __Height.GetAllowedValues( ) (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) |
Depth: 2 | _Depth: None | __Depth.DefaultValue( ): 2 | __Depth.GetAllowedTypes( ) Saved Value Restricted to Authorized Values ONLY | __Depth.GetAllowedValues( ) (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) |
this.IsNameSet( ): True this.GetName( ): _foo this.GetNameRaw( ): _foo this.GetNameDefaultValue( ): AccessorFuncDemoClass this.GetNameLen( ): 4 this.HasNameGetterPrefix( ): <class 'str'> this.GetNameGetterPrefix( ): None
this.IsXSet( ): False this.GetX( ): 1111 this.GetXRaw( ): None this.GetXDefaultValue( ): 1111 this.GetXLen( ): 4 this.HasXGetterPrefix( ): (<class 'int'>, <class 'float'>) this.GetXGetterPrefix( ): None
this.IsYSet( ): False this.GetY( ): 2222 this.GetYRaw( ): None this.GetYDefaultValue( ): 2222 this.GetYLen( ): 4 this.HasYGetterPrefix( ): (<class 'int'>, <class 'float'>) this.GetYGetterPrefix( ): None
this.IsZSet( ): False this.GetZ( ): 3333 this.GetZRaw( ): None this.GetZDefaultValue( ): 3333 this.GetZLen( ): 4 this.HasZGetterPrefix( ): (<class 'int'>, <class 'float'>) this.GetZGetterPrefix( ): None
this.IsBlahSet( ): False this.GetBlah( ): <class 'int'> this.GetBlahRaw( ): None this.GetBlahDefaultValue( ): <class 'int'> this.GetBlahLen( ): 13 this.HasBlahGetterPrefix( ): <class 'str'> this.GetBlahGetterPrefix( ): None
this.IsWidthSet( ): False this.GetWidth( ): 1 this.GetWidthRaw( ): None this.GetWidthDefaultValue( ): 1 this.GetWidthLen( ): 1 this.HasWidthGetterPrefix( ): (<class 'int'>, <class 'bool'>) this.GetWidthGetterPrefix( ): None
this.IsDepthSet( ): False this.GetDepth( ): 2 this.GetDepthRaw( ): None this.GetDepthDefaultValue( ): 2 this.GetDepthLen( ): 1 this.HasDepthGetterPrefix( ): None this.GetDepthGetterPrefix( ): (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
this.IsHeightSet( ): False this.GetHeight( ): 0 this.GetHeightRaw( ): None this.GetHeightDefaultValue( ): 0 this.GetHeightLen( ): 1 this.HasHeightGetterPrefix( ): <class 'int'> this.GetHeightGetterPrefix( ): (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
Ve bu, _foo özelliklerinin (ad hariç) tüm değerlerini aynı sırayla atadıktan sonra yapılır: 'string', 1.0, True, 9, 10, False
this.IsNameSet( ): True this.GetName( ): _foo this.GetNameRaw( ): _foo this.GetNameDefaultValue( ): AccessorFuncDemoClass this.GetNameLen( ): 4 this.HasNameGetterPrefix( ): <class 'str'> this.GetNameGetterPrefix( ): None
this.IsXSet( ): True this.GetX( ): 10 this.GetXRaw( ): 10 this.GetXDefaultValue( ): 1111 this.GetXLen( ): 2 this.HasXGetterPrefix( ): (<class 'int'>, <class 'float'>) this.GetXGetterPrefix( ): None
this.IsYSet( ): True this.GetY( ): 10 this.GetYRaw( ): 10 this.GetYDefaultValue( ): 2222 this.GetYLen( ): 2 this.HasYGetterPrefix( ): (<class 'int'>, <class 'float'>) this.GetYGetterPrefix( ): None
this.IsZSet( ): True this.GetZ( ): 10 this.GetZRaw( ): 10 this.GetZDefaultValue( ): 3333 this.GetZLen( ): 2 this.HasZGetterPrefix( ): (<class 'int'>, <class 'float'>) this.GetZGetterPrefix( ): None
this.IsBlahSet( ): True this.GetBlah( ): string Blah this.GetBlahRaw( ): string Blah this.GetBlahDefaultValue( ): <class 'int'> this.GetBlahLen( ): 11 this.HasBlahGetterPrefix( ): <class 'str'> this.GetBlahGetterPrefix( ): None
this.IsWidthSet( ): True this.GetWidth( ): False this.GetWidthRaw( ): False this.GetWidthDefaultValue( ): 1 this.GetWidthLen( ): 5 this.HasWidthGetterPrefix( ): (<class 'int'>, <class 'bool'>) this.GetWidthGetterPrefix( ): None
this.IsDepthSet( ): True this.GetDepth( ): 9 this.GetDepthRaw( ): 9 this.GetDepthDefaultValue( ): 2 this.GetDepthLen( ): 1 this.HasDepthGetterPrefix( ): None this.GetDepthGetterPrefix( ): (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
this.IsHeightSet( ): True this.GetHeight( ): 9 this.GetHeightRaw( ): 9 this.GetHeightDefaultValue( ): 0 this.GetHeightLen( ): 1 this.HasHeightGetterPrefix( ): <class 'int'> this.GetHeightGetterPrefix( ): (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
_foo --- MyClass: ---- id( this.__class__ ): 2231452349064 :::: id( this ): 2231448475016
Key Getter Value | Raw Key Raw / Stored Value | Get Default Value Default Value | Get Allowed Types Allowed Types | Get Allowed Values Allowed Values |
Name: _foo | _Name: _foo | __Name.DefaultValue( ): AccessorFuncDemoClass | __Name.GetAllowedTypes( ) <class 'str'> | __Name.GetAllowedValues( ) Saved Value Restrictions Levied by Data-Type |
x: 10 | _x: 10 | __x.DefaultValue( ): 1111 | __x.GetAllowedTypes( ) (<class 'int'>, <class 'float'>) | __x.GetAllowedValues( ) Saved Value Restrictions Levied by Data-Type |
y: 10 | _y: 10 | __y.DefaultValue( ): 2222 | __y.GetAllowedTypes( ) (<class 'int'>, <class 'float'>) | __y.GetAllowedValues( ) Saved Value Restrictions Levied by Data-Type |
z: 10 | _z: 10 | __z.DefaultValue( ): 3333 | __z.GetAllowedTypes( ) (<class 'int'>, <class 'float'>) | __z.GetAllowedValues( ) Saved Value Restrictions Levied by Data-Type |
Blah: string Blah | _Blah: string Blah | __Blah.DefaultValue( ): <class 'int'> | __Blah.GetAllowedTypes( ) <class 'str'> | __Blah.GetAllowedValues( ) Saved Value Restrictions Levied by Data-Type |
Width: False | _Width: False | __Width.DefaultValue( ): 1 | __Width.GetAllowedTypes( ) (<class 'int'>, <class 'bool'>) | __Width.GetAllowedValues( ) Saved Value Restrictions Levied by Data-Type |
Height: 9 | _Height: 9 | __Height.DefaultValue( ): 0 | __Height.GetAllowedTypes( ) <class 'int'> | __Height.GetAllowedValues( ) (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) |
Depth: 9 | _Depth: 9 | __Depth.DefaultValue( ): 2 | __Depth.GetAllowedTypes( ) Saved Value Restricted to Authorized Values ONLY | __Depth.GetAllowedValues( ) (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) |
Kısıtlı veri türleri veya değer kısıtlamaları nedeniyle bazı verilerin atanmadığını unutmayın - bu tasarım gereğidir. Ayarlayıcı, hatalı veri türlerinin veya değerlerin varsayılan değer olarak atanmasını bile engeller (varsayılan değer koruma davranışını geçersiz kılmadıkça)
Örnekler ve açıklamalar sonra yer yoktu çünkü kod burada yayınlanmadı ... Ayrıca değişecektir çünkü.
Lütfen Dikkat: bu gönderi sırasında dosya dağınık - bu değişecek. Ancak, Sublime Text'de çalıştırır ve derlerseniz veya Python'dan çalıştırırsanız, bir ton bilgi derleyip tükürür - AccessorDB kısmı yapılmaz (Print Getters ve GetKeyOutput yardımcısını güncellemek için kullanılır) bir Örnek işlevine değiştirilmenin yanı sıra, muhtemelen tek bir işleve yerleştirilir ve yeniden adlandırılır - işlevlerini arayın ..)
Sonraki: Çalıştırılması için her şey gerekli değildir - alttaki yorumlanmış birçok şey hata ayıklama için daha fazla bilgi içindir - indirdiğinizde orada olmayabilir. Eğer öyleyse, daha fazla bilgi almak için rahatsız edip yeniden derleyebilmelisiniz.
MyClassBase: pass, MyClass (MyClassBase) ihtiyacı için bir geçici çözüm arıyorum: ... - bir çözüm biliyorsanız - post it.
Sınıfta gerekli olan tek şey __ satırlarıdır - str init olduğu gibi hata ayıklamak içindir - Demo Sınıfından kaldırılabilirler, ancak aşağıdaki satırlardan bazılarını yorumlamanız veya kaldırmanız gerekecektir (_foo / 2/3 ) ..
Üstteki String, Dict ve Util sınıfları Python kütüphanemin bir parçasıdır - tam değildir. Kütüphaneden ihtiyacım olan birkaç şeyi kopyaladım ve birkaç tane yeni kitap oluşturdum. Tam kod, tüm kitaplığa bağlanır ve güncellenmiş çağrılar sağlayarak ve kodu kaldırır (aslında, kalan tek kod Demo Sınıfı ve baskı ifadeleri olacaktır - AccessorFunc sistemi kitaplığa taşınacaktır). ..
Dosyanın bir parçası:
##
## MyClass Test AccessorFunc Implementation for Dynamic 1-line Parameters
##
class AccessorFuncDemoClassBase( ):
pass
class AccessorFuncDemoClass( AccessorFuncDemoClassBase ):
__Name = AccessorFuncBase( parent = AccessorFuncDemoClassBase, name = 'Name', default = 'AccessorFuncDemoClass', allowed_types = ( TYPE_STRING ), allowed_values = VALUE_ANY, documentation = 'Name Docs', getter_prefix = 'Get', key = 'Name', allow_erroneous_default = False, options = { } )
__x = AccessorFuncBase( parent = AccessorFuncDemoClassBase, name = 'X', default = 1111, allowed_types = ( TYPE_INTEGER, TYPE_FLOAT ), allowed_values = VALUE_ANY, documentation = 'X Docs', getter_prefix = 'Get', key = 'x', allow_erroneous_default = False, options = { } )
__Height = AccessorFuncBase( parent = AccessorFuncDemoClassBase, name = 'Height', default = 0, allowed_types = TYPE_INTEGER, allowed_values = VALUE_SINGLE_DIGITS, documentation = 'Height Docs', getter_prefix = 'Get', key = 'Height', allow_erroneous_default = False, options = { } )
Bu güzellik, AccessorFuncs / geri çağrılar / veri türü / değer zorlaması, vb. İle dinamik olarak eklenen özelliklere sahip yeni sınıflar oluşturmayı inanılmaz derecede kolaylaştırır.
Şimdilik, bağlantı şudur (Bu bağlantı, belgedeki değişiklikleri yansıtmalıdır.): Https://www.dropbox.com/s/6gzi44i7dh58v61/dynamic_properties_accessorfuncs_and_more.py?dl=0
Ayrıca: Yüce Metin kullanmıyorsanız, Notepad ++, Atom, Visual Code ve diğerleri üzerinde tavsiye ederim, çünkü uygun iş parçacığı uygulamaları çok, çok daha hızlı hale getiriyor ... Ben de IDE benzeri bir kod üzerinde çalışıyorum bunun için harita sistemi - bir göz atın: https://bitbucket.org/Acecool/acecoolcodemappingsystem/src/master/ (Önce Paket Yöneticisine Repo Ekle, sonra Eklentiyi Yükle - 1.0.0 sürümü hazır olduğunda, ekleyeceğim ana eklenti listesine ...)
Umarım bu çözüm yardımcı olur ... ve her zamanki gibi:
Çalıştığı için doğru yapmaz - Josh 'Acecool' Moser
:
ve__init__
referanslarıself.fn_readyonly
.