Python对象实例是该语言中的唯一对象吗?

时间:2015-11-09 22:10:12

标签: python list object python-3.x

我想知道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唯一地标识同一个类的对象实例吗?

1 个答案:

答案 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/来改变此行为;让它根据您自己的标准返回TrueFalse,如果另一个对象不是您的类支持与之比较的类型,则返回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的实例。