Если вы используете python3.6 или более позднюю версию, вы можете сделать это, используя __init_subclass__
, что лично для меня лучше, чем метакласс.
Пример __init_subclass__
основан на описанном сценарии использования:
class Parent:
def __init_subclass__(cls):
if not hasattr(cls, 'parameters'):
raise TypeError(f'Subclass of {cls} does not have a parameters class attribute')
def __init__(self, **kwargs):
for param in self.__class__.parameters:
self.setattr(param, kwargs.get(param))
def compare(self, other):
for param in self.__class__.parameters:
if self.getattr(param) != other.getattr(param):
return False
return True
class GoodChild(Parent):
parameters = ['length', 'height', 'width']
class BadChild(Parent):
pass
В результате возникает исключение TypeError
при создании класса BadChild
(не при его создании): [ 119]
TypeError: Subclass of does not have a parameters class attribute
У меня нет категорических ответов, создающих средство доступа метода/свойства, которое не отображается, и это возвращает значение по умолчанию/несуществующий объект, если исполнительный адрес является пустым.
public Address GetAddressOrDefault()
{
return Address ?? new NullAddress();
}
Или подобный первому, создайте обертку для Вашего Address
то, что Вы используете в представлении.
public class AddressViewData
{
private Address address;
public AddressViewData(Address address)
{
this.address = address ?? new NullAddress();
}
// expose all address properties as pass-throughs
public string Street
{
get { return address.Street; }
}
}
Благодаря идеям Заторов (см. его ответ и комментарии) я изменил свойство Address своего объекта Человека от:
public virtual string Address { get; set; }
кому:
private Address _address;
public virtual Address Address
{
get { return _address ?? new Address(); }
set { _address = value; }
}
Это решило мою проблему, она работает, и это, кажется, работает с NHibernate. Yey!