GVKun编程网logo

未命名的Python对象具有相同的ID(python名称未定义)

3

在本文中,我们将带你了解未命名的Python对象具有相同的ID在这篇文章中,我们将为您详细介绍未命名的Python对象具有相同的ID的方方面面,并解答python名称未定义常见的疑惑,同时我们还将给您

在本文中,我们将带你了解未命名的Python对象具有相同的ID在这篇文章中,我们将为您详细介绍未命名的Python对象具有相同的ID的方方面面,并解答python名称未定义常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的c – 具有未命名命名空间的名称空间,声明了相同的变量、c# – 具有相同类型的命名和未命名注册的意外Unity容器行为、Java代理 – >为什么代理对象与原始对象具有相同的hashCode、numpy数组的多个元素具有相同的ID

本文目录一览:

未命名的Python对象具有相同的ID(python名称未定义)

未命名的Python对象具有相同的ID(python名称未定义)

让我们创建两个列表:

x = range(3)
y = range(3)
print id(x),id(y)

出:

4366592912 4366591040

我创建了两个独立的列表,输出显示了两个不同的内存地址。这不足为奇。但是,现在让我们在没有分配的情况下做同样的事情:

id(range(3))

出:

4366623376

还有第二次:

id(range(3))

出:

4366623376

我不确定如何解释这一点。为什么这两个未命名列表具有相同的内存地址?

c – 具有未命名命名空间的名称空间,声明了相同的变量

c – 具有未命名命名空间的名称空间,声明了相同的变量

我在下面尝试了这个虚拟代码来测试未命名的命名空间.

我有以下输出

ctor 1
 ctor 0
 3
 5

我对此有点困惑.

>我期待编译器发出错误,说它无法解决
关于:: m_a的歧义.相反,它始终指的是
少嵌套.总是这样吗? C遵循什么规则?
>似乎编译器按顺序创建变量CMyObj
写在文件上.总是这样吗?
>有没有办法访问最嵌套的m_a变量
来自main()?

class CMyObj{     
    public:
    CMyObj(int a){std::cout  << "ctor " << a << std::endl; }
 };
 namespace a{ 
      namespace{
           int m_a=4;
           int m_b=5;
           CMyObj m_obj(1);
      }  
 }
 namespace a{
      int m_a=3;
      CMyObj m_obj(0);
 }
 int main(){
      std::cout << a::m_a << std::endl; // which one?
      std::cout << a::m_b << std::endl; // how this is possible?
      return 0;
 }

解决方法

我没有C 03标准来检查那里的措辞,所以我将引用Fdis n3290.我认为这个问题的答案可以在3.4.3.2/2中的限定名称查找规则中找到:

For a namespace X and name m,the namespace-qualified lookup set S(X,m) is defined as follows: Let S0(X,m) be the set of all declarations of m in X and the inline namespace set of X (7.3.1). If S0(X,m) is not empty,S(X,m) is S0(X,m); otherwise,m) is the union of S(Ni,m) for all namespaces Ni nominated by using-directives in X and its inline namespace set.

现在,请记住,未命名的命名空间是具有using指令的唯一命名的命名空间.

c# – 具有相同类型的命名和未命名注册的意外Unity容器行为

c# – 具有相同类型的命名和未命名注册的意外Unity容器行为

我正在使用Unity版本2.1.505.2并在注册带有默认注册的UnityContainer和相同接口类型的命名注册(使用ParameterOverride)时看到意外行为.

如果我调用container.Resolve< T>()两次 – 一次用于命名注册,一次用于默认注册 – 我得到相同的实例,而我期望基于两个不同注册的不同实例.

这是一个代码示例:

public interface ICage
{
    IAnimal Animal { get; }
}

public class Cage : ICage
{
    public IAnimal Animal { get; private set; }
    public Cage(IAnimal animal) { Animal = animal; }
}

public interface IAnimal
{
    string Species { get; }
}

public class Cat : IAnimal
{
    public string Species { get { return "Felis catus"; } }
}

public class Dog : IAnimal
{
    public string Species { get { return "Canis lupus"; } }
}

[TestClass]
public class UnityTest
{
    [TestMethod]
    public void Mytest()
    {
        var container = new UnityContainer();

        // Default registrations for IAnimal and ICage
        container.RegisterType<IAnimal,Cat>(new ContainerControlledLifetimeManager());
        container.RegisterType<ICage,Cage>(new ContainerControlledLifetimeManager());

        // Named registration "cage2" for ICage mapping to Cage with constructor parameter override
        container.RegisterType<ICage>(
            "cage2",new ContainerControlledLifetimeManager(),new InjectionFactory(c => c.Resolve<Cage>(new ParameterOverride("animal",new Dog()))));

        // Resolve ICage using the named registraion "cage2"
        var cage2 = container.Resolve<ICage>("cage2");
        Assert.AreEqual("Canis lupus",cage2.Animal.Species); // Assert succeeds

        // Resolve ICage using the default registration ???
        var cage = container.Resolve<ICage>();
        Assert.AreEqual("Felis catus",cage.Animal.Species); // Assert fails (Actual:<Canis lupus>)
    }
}

测试中的第二个断言失败,因为cage.Animal.Species返回“Canis lupus”.

我错过了我的理解吗?如何进行设置,以便调用container.Resolve< ICage>(“cage2”)返回对应两个命名注册的Cage实例,并调用container.Resolve< ICage>()返回对应的实例默认注册?

解决方法

我花了2天时间解决你的问题,我已经知道了!

问题在于命名注册“cage2”.

你打电话的时候:

var cage2 = container.Resolve<ICage>("cage2");

你跑:

new InjectionFactory(c => c.Resolve<Cage>(new ParameterOverride("animal",new Dog()))));

看看内部c.Resolve< Cage>,当它调用unity创建的对象Cage时,新的Dog()作为IAnimal.但!以上,您注册的类型:

container.RegisterType<ICage,Cage>(new ContainerControlledLifetimeManager());

所以!内部c.Resolve< Cage>使用Dog创建对象Cage的无命名注册.并且,当它注册为ContainerControlled时,它保存值,并在您调用时:

var cage = container.Resolve<ICage>();

你得到了价值,已经创造了!

固定方案:

[TestClass]
public class UnityTest
{
    [TestMethod]
    public void Mytest()
    {
        var container = new UnityContainer();

        // Default registrations for IAnimal and ICage
        container.RegisterType<IAnimal,Cage>(new ContainerControlledLifetimeManager());

        container.RegisterType<ICage>(
            "cage2",new InjectionFactory(c => new Cage(new Dog())));

        // Resolve ICage using the named registraion "cage2"
        var cage2 = container.Resolve<ICage>("cage2");
        Assert.AreEqual("Canis lupus",cage2.Animal.Species); // Assert succeeds
        // Resolve default
        var cage = container.Resolve<ICage>();
        Assert.AreEqual("Felis catus",cage.Animal.Species); // Assert succeeds
    }
}

Java代理 – >为什么代理对象与原始对象具有相同的hashCode

Java代理 – >为什么代理对象与原始对象具有相同的hashCode

我编写了这个测试类,我想知道为什么代理对象确实具有与原始对象相同的hashCode.有谁知道为什么?

public class Main {

public static void main(String[] args) {
    final Service realSubject = new Subject_A();
    final Service proxySubject = proxygenerator.makeProxy(Service.class,realSubject);
    final String hello = proxySubject.work("Hello");
    System.out.println("hello = " + hello);
    System.out.println("\n");
    System.out.println("realSubject: " + realSubject);
    System.out.println("proxySubject: " + proxySubject);
}
}

这是一个示例输出:

in Subject_A#work: str = Hello
hello = Hello_DONE


realSubject: at.me.proxy.Subject_A@4f4a7090
proxySubject: at.me.proxy.Subject_A@4f4a7090
最佳答案
代理用于间接访问底层对象,就客户端代码而言,应隐藏代理的存在.

通常,此模式用于诸如spring和hibernate之类的框架中,以使用事务或安全功能来装饰对象.
鉴于上述情况,代理对象与hashcode(),equals()和toString()作为底层对象具有相同的输出是很自然的.

编辑

根据@Holger的更正进行更新

首先,您观察到的是toString()调用的相同输出,而不是hashcode().
通过代理实现equals()比初看起来更微妙一些.在equals()的典型实现中,根据equals contract会违反对称属性:

for any non-null reference values x and y,x.equals(y) should return true if and only if y.equals(x) returns true.

你有

// works since you delegate same instance of wrapped class to underyling object
proxy.equals(wrapped); // true

wrapped.equals(proxy); // false

由于:

 // proxy class != wrapped class 
 if (this.getClass() != obj.getClass()) {
        return false;
 }

正如@Holger建议的那样,包含相同底层实例的两个代理可以是相同的而不会违反对称性.

使代理等于包装实例的选项(反之亦然)可以是通过接口成员(getter)为包含对象相等性的状态实现equals,并将类与此接口进行比较.由于代理和底层对象都符合这个接口,因此它们是相同的.

numpy数组的多个元素具有相同的ID

numpy数组的多个元素具有相同的ID

File "C:\Users\[user]\AppData\Local\Programs\Python\Python38\lib\site-packages\django\db\models\fields\__init__.py",line 933,in value_from_object
    return getattr(obj,self.attname)
AttributeError: 'DateTimeField' object has no attribute 'attname'

小整数的id是唯一的,但这不是数组包含的内容:

In [54]: x=np.array([1,2,3,4])
In [55]: [type(a) for a in x]
Out[55]: [numpy.int64,numpy.int64,numpy.int64]
In [56]: [id(a) for a in x]
Out[56]: [140147220886728,140147220887808,140147220886728,140147220887808]

获取In [57]: [type(a) for a in x.tolist()] Out[57]: [int,int,int] In [58]: [id(a) for a in x.tolist()] Out[58]: [10914496,10914528,10914560,10914592] In [59]: id(2) Out[59]: 10914528 对象的另一种方法:

int

修改

如果我将In [60]: [id(a.item()) for a in x] Out[60]: [10914496,10914592] 的元素分配给变量元组,则x不会被重用。 id仍在使用中,因此id(x0)无法使用它。 id(x2)中的更改只是解释程序对内存重用的人工产物。

Out[56]

关于未命名的Python对象具有相同的IDpython名称未定义的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于c – 具有未命名命名空间的名称空间,声明了相同的变量、c# – 具有相同类型的命名和未命名注册的意外Unity容器行为、Java代理 – >为什么代理对象与原始对象具有相同的hashCode、numpy数组的多个元素具有相同的ID的相关信息,请在本站寻找。

本文标签: