也许这不是接近类结构的正确方法,但是,我试图在__init__
中存储数据集,然后在另一个函数中调用它们以读取head
的前几个结果,但是我没有得到数据帧输出。
例如:
import faraway.datasets.pima
pima = faraway.datasets.pima.load()
#print(pima.head())
class automate_lm:
def __init__(self, data):
__dataset__ = data
def __print__(self):
__p__ = self.__dataset__.head()
return(__p__)
if __name__ == '__main__':
test=automate_lm(pima)
print(test.__print__)
给:
<bound method automate_lm.__print__ of <__main__.automate_lm object at 0x7fae1014b670>>
预期输出:pregnant glucose diastolic triceps insulin bmi diabetes age test
0 6 148 72 35 0 33.6 0.627 50 1
1 1 85 66 29 0 26.6 0.351 31 0
2 8 183 64 0 0 23.3 0.672 32 1
3 1 89 66 23 94 28.1 0.167 21 0
4 0 137 40 35 168 43.1 2.288 33 1
忘记在'dataset前面放self'
_dataset(伪私有属性)听起来比__dataset__好
下划线vs带有变量和方法的双下划线
是一种更python化的方式,看起来像这样
class automate_lm:
def __init__(self, data):
self._dataset = data
def __str__(self):
return self._dataset.__str__()
def __repr__(self):
return self._dataset.__repr__()
if __name__ == '__main__':
test = automate_lm(pima)
print(test)
好的,我看到你的代码中有两个简单但致命的错误。
我将试着用一个虚拟的数据框架来重现你的代码,向你解释这一点。
import pandas as pd
df = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]],columns = ["a","b","c"])
class automate_lm:
def __init__(self, data):
self.__dataset__ = data # First correction
def __print__(self):
__p__ = self.__dataset__.head() # First correction
return(__p__)
if __name__ == '__main__':
test=automate_lm(df)
print(test.__print__()) # Second correction
第一校正
对于可以通过类内所有函数访问的变量,应该在开始时赋值并调用self.
。你在两个地方犯了这个错误。赋值时和调用时。
第二校正
当你想打印一个函数的结果时,你应该用(*args,**kwargs)
结尾来调用这个函数。但是你只是叫了它的名字,连括号都没有。只要指向函数在内存中的位置。它会给你<bound method automate_lm.__print__ of <__main__.automate_lm object at 0x7fae1014b670>>
您应该像这样在__init__
中添加self.
def __init__(self, data):
self.__dataset__ = data
那么你可以在其他方法中使用它。
def __print__(self):
__p__ = self.__dataset__.head()
return(__p__)
在调用__print__
时也有错误,您需要使用()
调用它,如:
print(test.__print__())