如何解决当__init__将数组作为参数时,Python的__repr__方法
我对使用Python进行OOP相当陌生,并试图了解__repr__
方法在该特定实例中应如何输出。
初始化播放列表类时,可以将包含歌曲对象的数组作为参数传递。您也可以不传递任何内容作为参数,并使用单独的add_song
方法将歌曲对象添加到播放列表。
但是,在这种情况下,我不确定如何设置__repr__
方法。如果我传递一个包含10多个歌曲对象的数组,则repr方法的输出将非常大-因为每个歌曲对象本身都有多个参数。
是否有Python的方法?
编辑:为了使我的问题不再那么模糊-根据我的理解,repr方法旨在返回对象的字符串表示形式。就我而言,播放列表对象是作为参数传递给数组的(或者什么也没有)。如果传递数组,则其中包含歌曲对象,它们本身具有许多参数,例如歌曲名称,歌曲语言等。我的问题是在这种情况下是否存在“正确”的方法来设置repr方法-或者这真的取决于我自己决定。
class Playlist:
def __init__(self,songs = None):
if songs is None:
self.playlist = []
else:
self.playlist = songs
def __repr__(self):
return (f"{self.__class__.__name__}({self.playlist})")
打印播放列表对象的输出:
播放列表([歌曲(随机歌曲名称1,英语,50),歌曲(随机歌曲名称 2,英语,25)])
解决方法
由您决定。与更人性化的repr
相比,str
返回的字符串将提供更多的键入信息。如果尺寸受阻,您可以自由选择自己认为最佳的方式。例如,pandas
为您提供了一个简短的视图,其中包含其他细节,例如完整尺寸。
>>> df=pd.DataFrame([list(range(5)) for _ in range(500)])
>>> print(repr(df))
0 1 2 3 4
0 0 1 2 3 4
1 0 1 2 3 4
2 0 1 2 3 4
3 0 1 2 3 4
4 0 1 2 3 4
.. .. .. .. .. ..
495 0 1 2 3 4
496 0 1 2 3 4
497 0 1 2 3 4
498 0 1 2 3 4
499 0 1 2 3 4
[500 rows x 5 columns]
可以对歌曲做同样的事情。
, <?php
$serverName = "akramlaptop\sqlexpress"; //serverName\instanceName
$connectioninfo = array ("Database"=>"Mtdata");
$conn = sqlsrv_connect($serverName,$connectioninfo);
echo "<table align='center' border='1' bordercolor='black'><form action='' method='POST'>";
echo "<tr bgcolor='#D8D8D8'><td align=left size=3>MAC-Address</td><td size=3>IP</td><td size=3>Name</td>";
use PEAR2\Net\RouterOS;
require_once 'PEAR2_Net_RouterOS-1.0.0b6.phar';
define('TYPE_DATA','!re');
define('TYPE_FINAL','!done');
define('TYPE_ERROR','!trap');
define('TYPE_FATAL','!fatal');
$client = new RouterOS\Client('ip','user','password',port);
echo 'Connected!';
$responses = $client->sendSync(new RouterOS\Request('/ip/arp/print'));
foreach ($responses as $response) {
if ($response->getType() != '!done') {
$col1 = $response->getProperty('address');
$col2 = $response->getProperty('mac-address');
$sql = "INSERT INTO arplog (ip,mac) VALUES ('$col1','$col2')";
#where $col2 not in (select mac from arplog)
#$params = array(1,"some data");
$stmt = sqlsrv_query( $conn,$sql);
if( $stmt === false ) {
die( print_r( sqlsrv_errors(),true));
}
}
}
#Show inserted Data
$sql2 = "SELECT ip,arplog.mac as [macc],Name FROM [MTData].[dbo].[ARPLog] left join [MTData].[dbo].[MacOwner] on arplog.Mac = MacOwner.Mac";
$result = sqlsrv_query($conn,$sql2);
while($row = Sqlsrv_fetch_array($result,SQLSRV_FETCH_ASSOC)) {
echo "<tr>";
echo "<td>". $row['macc'] ."</td>";
echo "<td>". $row['ip'] ."</td>";
echo "<td>". $row['Name'] ."</td>";
}
sqlsrv_close($conn);
?>
在Python中
根据Python的官方文档,
__repr__
是一个内置函数,用于计算对象的“正式”字符串信誉,
__repr__
应该为返回对象的字符串表示形式。这对于调试很有用。这意味着您应该以自己喜欢的方式返回类的所有属性。
示例
__repr__
从您的示例中,您需要返回歌曲的名称及其ID。
class Entity:
def __init__(self,name):
self.name = name
def __repr__(self):
return "Name: " + self.name
这是我的做法。您可以自由选择输出格式。我很确定您在此类中必须具有更多属性。您将在此函数中返回它们。
根据您的问题
的确,如果您有一个对象的大量歌曲,则字符串表示形式可能会很大。一个好的方法必须是使字符串表示更有条理,因此更易于阅读。像
def __repr__(self):
songs = ""
for i in range(len(playlist)):
songs+=f"{i+1}. {playlist[i]}"
return songs
此方法的要点是,您可以随时调用它并获取对象的所有属性。假设您遇到艺术家显示不正确的问题。调试的一个好开始是可以有组织地显示对象属性,以便您可以追溯到问题的确切出处。
- 您可以将歌曲分为不同的流派/艺术家并进行打印 他们分开
- 通过将字符串写入文件来更进一步。 安静地阅读所有内容。这完全取决于您。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。