在本文中,我们将带你了解未命名的Python对象具有相同的ID在这篇文章中,我们将为您详细介绍未命名的Python对象具有相同的ID的方方面面,并解答python名称未定义常见的疑惑,同时我们还将给您
在本文中,我们将带你了解未命名的Python对象具有相同的ID在这篇文章中,我们将为您详细介绍未命名的Python对象具有相同的ID的方方面面,并解答python名称未定义常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的c – 具有未命名命名空间的名称空间,声明了相同的变量、c# – 具有相同类型的命名和未命名注册的意外Unity容器行为、Java代理 – >为什么代理对象与原始对象具有相同的hashCode、numpy数组的多个元素具有相同的ID。
本文目录一览:- 未命名的Python对象具有相同的ID(python名称未定义)
- c – 具有未命名命名空间的名称空间,声明了相同的变量
- c# – 具有相同类型的命名和未命名注册的意外Unity容器行为
- Java代理 – >为什么代理对象与原始对象具有相同的hashCode
- numpy数组的多个元素具有相同的ID
未命名的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 – 具有未命名命名空间的名称空间,声明了相同的变量
我有以下输出
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; }
解决方法
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容器行为
如果我调用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>()返回对应的实例默认注册?
解决方法
问题在于命名注册“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
我编写了这个测试类,我想知道为什么代理对象确实具有与原始对象相同的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
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对象具有相同的ID和python名称未定义的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于c – 具有未命名命名空间的名称空间,声明了相同的变量、c# – 具有相同类型的命名和未命名注册的意外Unity容器行为、Java代理 – >为什么代理对象与原始对象具有相同的hashCode、numpy数组的多个元素具有相同的ID的相关信息,请在本站寻找。
本文标签: