所以我有一个继承自Page
(第二个后代:CreationDialog : MainPage : Page
)的类型,带有无参数构造函数。我在PageFactory
类中有一个静态通用工厂方法:
public static class PageFactory
{
public static T GetInstance<T>(WebDriver driver) where T : Page, new()
{
T page = new T
{
Driver = driver
};
return page;
}
}
public class Page
{
public static T GetInstance<T>() where T : Page, new()
{
return PageFactory.GetInstance<T>(Utils.GetCurrentDriver());
}
}
public class CreationDialog : MainPage, IModal
{
public CreationDialog()
{
IModal _Modal = Modal.Get(WindowLocator);
}
IModal _Modal { get; set; }
}
Modal.Get(WindowLocator)
是一个带静态参数的静态方法。
问题是 - 当我调用GetInstance<CreationDialog>()
时,当_Modal
中的方法稍后被调用时,我最终没有初始化_Modal
和空引用异常。
调试器显示当调用get实例时,类型参数是相应的CreationDialog
,那么为什么不调用它自己的构造函数呢?我错过了什么?
更新:到达CreationDialog
构造函数中的断点,但是在构造函数返回到方法范围page
之后,变量设置为null
并且仅使用{{初始化它1}}。
我可以阅读这个主题,因为我似乎无法获得构造函数和继承权吗?
答案 0 :(得分:2)
问题是本地与成员范围。改变这个:
images, depths, invalid_depths = dataset.csv_inputs(TRAIN_FILE)
def csv_inputs(self, csv_file_path):
filename_queue = tf.train.string_input_producer([csv_file_path], shuffle=True)
reader = tf.TextLineReader()
_, serialized_example = reader.read(filename_queue)
filename, depth_filename = tf.decode_csv(serialized_example, [["path"], ["annotation"]])
# input
jpg = tf.read_file(filename)
image = tf.image.decode_jpeg(jpg, channels=3)
image = tf.cast(image, tf.float32)
# target
depth_png = tf.read_file(depth_filename)
depth = tf.image.decode_png(depth_png, channels=1)
depth = tf.cast(depth, tf.float32)
depth = tf.div(depth, [255.0])
#depth = tf.cast(depth, tf.int64)
# resize
image = tf.image.resize_images(image, (IMAGE_HEIGHT, IMAGE_WIDTH))
depth = tf.image.resize_images(depth, (TARGET_HEIGHT, TARGET_WIDTH))
invalid_depth = tf.sign(depth)
# generate batch
images, depths, invalid_depths = tf.train.batch(
[image, depth, invalid_depth],
batch_size=self.batch_size,
num_threads=4,
capacity= 50 + 3 * self.batch_size,
)
return images, depths, invalid_depths
对此:
logits_val = sess.run([ logits, what_do_i_have-to put here], feed_dict={keep_conv: 0.8, keep_hidden: 0.5})
虽然这会更好:
public class CreationDialog : MainPage, IModal
{
public CreationDialog()
{
IModal _Modal = Modal.Get(WindowLocator);
}
IModal _Modal { get; set; }
}
答案 1 :(得分:1)
您将两次声明_Modal,一次作为局部变量,一次作为属性。您正在为变量赋值,要设置属性的值,只需删除类型声明。
public class CreationDialog : MainPage, IModal
{
public CreationDialog()
{
_Modal = Modal.Get(WindowLocator);
}
IModal _Modal { get; set; }
}