我有以下情况。我是子类化,想知道子类消失后超类会发生什么
以下是我的实施:
from sklearn.decomposition import PCA
from sklearn import preprocessing
import numpy as np
import pandas as pd
import csv
import matplotlib.pyplot as plt
number_of_PCA = 20
# Reading csv file
training_file = 'Training.csv'
testing_file = 'Test.csv'
dataframe_train = pd.read_csv(training_file)
dataframe_test = pd.read_csv(testing_file)
#Training values
features_labels_train = dataframe_train.columns.values[:-2]
class_labels_train = dataframe_train.iloc[:,-2]
feature_values_train = dataframe_train.iloc[:,:-2]
train_onehot = dataframe_train.iloc[:,-1]
#Test values
feature_labels_test = dataframe_test.columns.values[:-2]
class_labels_test = dataframe_test.iloc[:,-2]
features_values_test = dataframe_test.iloc[:,:-2]
test_onehot = dataframe_test.iloc[:,-1]
#values standardisation
stdsc = preprocessing.StandardScaler()
np_scaled_train = stdsc.fit_transform(feature_values_train)
np_scaled_test = stdsc.transform(features_values_test)
pca = PCA(n_components=number_of_PCA)
X_train_pca = pca.fit_transform(np_scaled_train) # This is the result
X_test_pca = pca.transform(np_scaled_test)
......................................................
给我以下输出:
class Program
{
static void Main(string[] args)
{
using (var a = new SuperHuman())
{
}
Console.ReadLine();
}
}
class Human : IDisposable
{
public string LoType = "Normal";
public Human()
{
Console.WriteLine("Human Created");
}
public string GetHumanType()
{
return LoType;
}
public void Dispose()
{
Console.WriteLine("{0} Human Class gONE", LoType);
}
}
class SuperHuman : Human
{
public SuperHuman()
{
LoType = "Super";
Console.WriteLine("{0} Human Created",LoType);
}
}
我想知道的是,如果父类也消失了 如果不是我如何与儿童班一起处理它?</ p>
答案 0 :(得分:3)
为了清楚起见,一旦你处理它,实例就不会消失。它已经释放了所有非托管资源,之后可以免费提供,这样垃圾收集器就可以把它拿起来。
在您的示例代码中,只有一个实例(您不必为派生类及其基类创建两个实例)。您无法从内存中删除半个实例。它在那里或它消失了。
派生类&#39;在using
块结束后,实例将被释放给垃圾回收器(不是因为using
,而是留下了范围)。在适当的时候,垃圾收集器将释放内存。
答案 1 :(得分:0)
首先,似乎对类和对象之间的区别存在一些混淆。
使用new
- 关键字,实例化SuperHuman
的新实例。
using (var a = new SuperHuman())
{
// inside this block, "a" contains a reference to a SuperHuman-Object,
// which is also a Human-Object and thus can be Disposed.
// (As it implements IDisposable and must have a Dispose-Method)
}
所以基本上你的课程根本没有发生任何事情。 using
阻止在最后调用对象上的Dispose()-Method
。所以无论你做什么里面这个方法都要完成。
IDisposable
- 界面我不打算在这里深入解释。
这是MSDN
的界面说明提供释放非托管资源的机制。
这意味着,如果您定义实现Human
的类 IDisposable
,则所有非托管资源(例如数据库连接)将在调用{{{ 1}} - 方法。所以你负责在代码中释放这些资源。但是,Human仍然是托管资源。但这与Dispose()
无关,因为托管资源正由Garbage Collection最终确定,当对象时,它会自动检测到不再使用了。
但非托管资源究竟是什么?
已经回答here。
即使界面不适合,您也可以通过将值设置为IDisposable
来释放托管资源。其工作原理也已在另一个Thread中得到解答。