def chunks(iterable,n):
"""assumes n is an integer>0
"""
iterable=iter(iterable)
while True:
result=[]
for i in range(n):
try:
a=next(iterable)
except StopIteration:
break
else:
result.append(a)
if result:
yield result
else:
break
g1=(i*i for i in range(10))
g2=chunks(g1,3)
print g2
'<generator object chunks at 0x0337B9B8>'
print list(g2)
'[[0, 1, 4], [9, 16, 25], [36, 49, 64], [81]]'
Свойство на самом деле является своего рода «синтаксическим сахаром» и реализуется двумя методами: методом получения и методом установки.
Итак, я думаю, что вы сможете определить, свойство является абстрактным, проверяя, являются ли геттер и / или сеттер абстрактными, например:
PropertyInfo pi = ...
if( pi.GetSetMethod().IsAbstract )
{
}
И, AFAIK, поле не может быть абстрактным. ;)
Во-первых: поля не могут быть абстрактными, поскольку все, что для них есть, - это само поле.
Затем мы отмечаем, что свойства (в широком смысле!) На самом деле get_ / set_ методы под капотом.
Затем мы проверяем, что имеет свойство IsAbstract
, и видим, что MethodBase
(и так MethodInfo
]).
Наконец, мы вспоминаем / знаем / выясняем, что PropertyInfo
имеет методы GetGetMethod ()
и GetSetMethod ()
, возвращающие MethodInfo
, и мы закончили, за исключением заполнения беспорядочных деталей о наследовании и так далее.