Это довольно просто, просто исправьте проход двоеточий в self
и cls
:
class A:
@staticmethod
def some_method():
# pass
return
@classmethod
def do_something(cls):
cls.some_method()
return
class B(A):
@staticmethod
def some_method():
print("I did stuff!")
return
@classmethod
def run(cls):
B.do_something()
return
k = B()
k.run()
>>>"I did stuff!"
И если вы хотите вызвать старый do_something
(тот, что в классе A ) из класса B, просто перейдите в соответствующий класс. В классе B:
@classmethod
def run(cls):
A.do_something()
return
Unforutnately там не является никаким путем, встроенным к C#
Можно зарегистрировать этот факт, но это не будет автоматически проверено.
Если Вы используете resharper, то он может быть настроен для проверки этого правильно, когда метод отмечен с [NotNull] атрибут.
Иначе можно пользоваться библиотекой Microsoft Contracts и добавить что-то подобное следующему к методу, но это - довольно много дополнительной формулировки для такой простой аннотации.
Contract.Ensures(Contract.Result<string>() != null)
Spec# решил эту проблему путем разрешения a! после типа для маркировки его как непустой тип, например,
string! foo
но Spec# может только использоваться для предназначения для.NET2 и был захвачен библиотекой Code Contracts.
Если Вы не используете тип на основе Системы. ValueType, я думаю, что Вам не повезло. Его, вероятно, лучший для документирования этого ясно в XML/metadata комментируют для функции.
Я не знаю, что существует лучшая практика для того, чтобы сделать так от API, поскольку я все еще программировал бы оборонительно и проверка на пустой указатель как потребитель. Я думаю, что это - все еще лучшая практика в этом случае, поскольку я склонен не хотеть доверять другому коду, чтобы всегда сделать правильную вещь.
Единственный проверенный в типе способ гарантировать, что объект C# никогда не возвращает пустой указатель, состоит в том, чтобы использовать структуру. Структуры могут иметь участников, которые содержат нулевые значения, но никогда не могут быть пустыми сами.
Все другие объекты C# могут быть несуществующими.
Пример кода:
public struct StructExample
{
public string Val;
}
public class MyClass
{
private StructExamle example;
public MyClass()
{
example = null; // will give you a 'Cannot convert to null error
}
public StructExample GetXyz()
{
return null; // also gives the same error
}
}
Вышеупомянутый пример не скомпилирует. Если использование структуры приемлемо (это становится типом значения, роздан на стеке, не может быть разделен на подклассы), затем, это могло бы работать на Вас.
Если у Ваших пользователей есть Ваш исходный код с помощью стандартного дизайна контракта API как: http://www.codeproject.com/KB/cs/designbycontract.aspx может ясно дать понять вещи.
Иначе Ваш лучший выбор через документацию.
Мне нравится думать о нем наоборот: если моя функция могла бы возвратить нулевое значение, я лучше удостоверяюсь, что пользователь функции знает об этом.
Вы могли включать Отладку. Утверждайте () метод. В то время как это, конечно, не осуществит условие, оно должно прояснить (наряду с документацией), что нулевое значение не приемлемо.
Любой документ это хорошо (возможно, с системой документации стандарта.NET) или необходимо использовать некоторый Контракт API. Вот некоторые: http://geekswithblogs.net/Podwysocki/archive/2008/01/22/118770.aspx http://www.codeproject.com/KB/cs/designbycontract.aspx