add cached_property
add unittest 待改进