我想知道Python如何处理用户定义的对象。所以这是场景:
我创建了自己的名为MyClass的类:
Uncaught TypeError: Cannot read property 'string' of undefined
所以问题是,python的remove函数能够区分同一个类的不同对象实例吗?是否存在任何不能唯一标识我想要删除的对象实例的边角情况?
可能的情况是:
import React from "react";
var $ = require('jquery');
class ChatList extends React.Component{
getInitialState(){
return{
chat:[]
}
}
getChats (){
$ajax({
url: this.props.URL,
type:'GET',
beforeSend: function(request){
request.setRequestHeader("X-Parse-Application-Id","AppID");
request.setRequestHeader("X-Parse-REST-API-Key","AppKEY");
request.setRequestHeader("Content-Type","application/json");
},
error: function(data){
console.log('There was an error in getting the chats');
},
success:function(data){
if(this.isMounted()){
this.setState({
chats: data.results
});
}
}.bind(this)
})
}
ComponentDidMount (){
this.interval = setInterval(function(){
this.getCharts();
}.bind(this),1000)
}
ComponentWillUnmount(){
clearInterval(this.interval);
}
render(){
var list = this.state.chats.map((item,index)=>{
return <li className = "list-group-item" key={item.objectId}> {item.text} </li>
})
return (
<ul className="list-group">
{list}
</ul>
)
}
}
ChatList.PropTypes = {
URL: props.string.isRequired
};
ChatList.defaultProps = {
URL: 'https://api.parse.com/1/classes/chat/'
};
export default ChatList;
将删除哪个对象实例?我猜是3通过的那个,但是有一条规则说python唯一地标识同一个类的对象实例吗?
答案 0 :(得分:2)
list.remove()
删除测试相等的第一个对象。来自documentation:
s.remove(x)
从 s 中删除第一项s[i] == x
默认情况下,自定义类的实例仅在它们是完全相同的对象时才测试相等;如果s[i] is x
返回true,则s[i] == x
也会返回true。
它不是定义实例的变量名称;在第二个示例中,它将是从列表中删除的MyClass(3)
实例,因为它是一个唯一对象,与您之前创建和添加的MyClass(5)
实例不同。您可以使用id()
function来检查,CPython上的object.__eq__()
method基本上返回当前的内存地址:
>>> myclass1 = MyClass(5)
>>> id(myclass1)
4349144816
>>> example.Add(myclass1)
>>> myclass1 = MyClass(3)
>>> id(myclass1)
4349145040
>>> example.Add(myclass1)
>>> example.container
[<__main__.MyClass object at 0x1033aaef0>, <__main__.MyClass object at 0x1033aafd0>]
>>> hex(id(myclass1))
'0x1033aafd0'
>>> myclass1 is example.container[1]
True
>>> example.Remove(myclass1)
>>> example.container
[<__main__.MyClass object at 0x1033aaef0>]
请注意,自定义类的默认表示形式包含十六进制的id()
值!
您可以通过覆盖https://jsfiddle.net/pyexm7us/1/来改变此行为;让它根据您自己的标准返回True
或False
,如果另一个对象不是您的类支持与之比较的类型,则返回NotImplemented
单例(因此Python可以委托给其他对象)。
例如,如果您的number
属性相同时您的实例应该被视为相等,那么您可以像这样实现它:
class MyClass():
def __init__(self, number):
self.number = number
def __eq__(self, other):
if not isinstance(other, MyClass):
return NotImplemented
return self.number == other.number
通过此更改,您可以执行此操作:
example.Add(MyClass(42))
example.Add(MyClass(81))
example.Remove(MyClass(42))
这将删除number
设置为42
的实例。