Python:父类实例的子实例类
我是新手 我想知道父类实例p何时初始化,子类实例C何时初始化 像 问题2:现在,如果我创建一个实例z=B,我想将z创建为p的子实例,也就是说,只有在较早的实例p存在的情况下,才应该创建z。 P的属性应该向下流到z/如果有数据添加到属性中。 如果P不存在,则基本上不应创建z 类似地,当x=A时,y=B 有办法吗 我这样做是因为我正在创建一个程序,在这个程序中,可以在不同的上下文中创建类a的多个实例,比如Python:父类实例的子实例类,python,class,oop,python-2.7,Python,Class,Oop,Python 2.7,我是新手 我想知道父类实例p何时初始化,子类实例C何时初始化 像 问题2:现在,如果我创建一个实例z=B,我想将z创建为p的子实例,也就是说,只有在较早的实例p存在的情况下,才应该创建z。 P的属性应该向下流到z/如果有数据添加到属性中。 如果P不存在,则基本上不应创建z 类似地,当x=A时,y=B 有办法吗 我这样做是因为我正在创建一个程序,在这个程序中,可以在不同的上下文中创建类a的多个实例,比如 Mathematics = A() English = A() Now, Algebra =
Mathematics = A()
English = A()
Now,
Algebra = B() iff Mathematics = A()
And
Grammar = B() iff English = A()
是否有自检程序来检查?我是说那是怎么做到的
Q2更新:询问的另一种方式是,在创建实例以检查类的实例并获取特定实例数据时,是否有方法签入B类?
就像在B类中,检查由类A构成的实例,然后选择一个实例,并从该实例的属性中获取数据到由类B创建的实例
也
您没有在B中调用uuu init_uuuu。使用函数名只会为您提供该函数对象。__init__后的括号实际上执行函数
超级,self返回一个类,而不是一个有意义的对象-一个类没有superinstance,它有一个超类,所以你在这个类上调用_class_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。在self上使用_类,因为self是类的实例
class B(A):
def __init__(self):
super(B, self).__init__()
print type(self).__name__
print super(B, self).__name__
请注意,我使用类型over accessing __类_;-使用内置函数比直接访问magic值要好。它更具可读性,并允许使用特殊功能。在B中没有调用_init_uu。使用函数名只会为您提供该函数对象。__init__后的括号实际上执行函数
class A(object):
def __init__(self):
print "A created"
class B(A):
def __init__(self):
super(B, self).__init__() # Q1: How to get "A created" from parent class?
b = B()
--output:--
A created
超级,self返回一个类,而不是一个有意义的对象-一个类没有superinstance,它有一个超类,所以你在这个类上调用_class_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。在self上使用_类,因为self是类的实例
class B(A):
def __init__(self):
super(B, self).__init__()
print type(self).__name__
print super(B, self).__name__
请注意,我使用类型over accessing __类_;-使用内置函数比直接访问magic值要好。它更具可读性,并允许特殊功能
class A(object):
def __init__(self):
print "A created"
class B(A):
def __init__(self):
super(B, self).__init__() # Q1: How to get "A created" from parent class?
b = B()
--output:--
A created
我想将z创建为p的子实例,即z应仅为
如果存在早期实例P,则创建。以及P的属性
如果属性中添加了任何数据,则应向下流至z
1为什么你把z称为p的“子实例”?你说将z作为“子实例”等同于仅当P的实例存在时才创建z。为什么呢这种“子实例”语言来自哪里?如果20已经存在,你是否也说整数10是20的“子实例”
2p不是一个类,因此p的任何属性都不会在任何地方流动
更新2
class A(object):
def __init__(self, name):
self.name = name
class B(A):
def __init__(self, anA, age):
super(B, self).__init__(anA.name)
self.age = age
existingA = {}
a = A("Sally")
existingA["Sally"] = a
a = A("George")
existingA["George"] = a
x = "Sally"
if x in existingA:
b = B(existingA[x], 30)
print b.name, b.age
--output:--
Sally 30
我想将z创建为p的子实例,即z应仅为
如果存在早期实例P,则创建。以及P的属性
如果属性中添加了任何数据,则应向下流至z
1为什么你把z称为p的“子实例”?你说将z作为“子实例”等同于仅当P的实例存在时才创建z。为什么呢这种“子实例”语言来自哪里?如果20已经存在,你是否也说整数10是20的“子实例”
2p不是一个类,因此p的任何属性都不会在任何地方流动
更新2
class A(object):
def __init__(self, name):
self.name = name
class B(A):
def __init__(self, anA, age):
super(B, self).__init__(anA.name)
self.age = age
existingA = {}
a = A("Sally")
existingA["Sally"] = a
a = A("George")
existingA["George"] = a
x = "Sally"
if x in existingA:
b = B(existingA[x], 30)
print b.name, b.age
--output:--
Sally 30
通过阅读更新后的第2季度和第1季度,听起来你对课程以及它们能为你做什么有一个基本的误解。这是有道理的,因为你说你是OOP新手 除非我知道您熟悉哪些非OOP语言,否则我将在这里与术语相冲突,但我将使用C示例,故意掩盖一系列问题,并声称您的类a类似于结构a,而您的类B只是一个包含整个结构a的结构B: 如果你创建了一个B的新实例,你不能改变它的a成员的类型,它总是一个实际的a。不管是否有结构A2类型或实例,B的内容只包括一个a 听起来你想要的根本不是一个子类,而只是一个普通的成员,在C中,它更像是一个指向其他对象的指针,而不是将其合并到一起:
class A1(object):
def __init__(self):
pass
def about(self):
print 'I am an A1'
class A2(object):
def __init__(self):
pass
def about(self):
print 'I am an A2'
class B(object):
def __init__(self, connected_to = None):
self.connected_to = connected_to
def about(self):
print 'I am a B'
if self.connected_to is not None:
print '... and I am connected to a %s:' % type(self.connected_to)
self.connected_to.about() # and ask it to describe itself
else:
print '... and I am connected to no one!'
在C中,至少有一个指针,如果它是void*-意味着你可以指向你需要的任何类型,或者什么都不指向,就像上面的a B可以连接到None,而不是A1或A2,或者任何东西,只要它有
鉴于上述情况,您可以执行以下操作:
>>> B(A1()).about()
I am a B
... and I am connected to a <class '__main__.A1'>:
I am an A1
>>> B(A2()).about()
I am a B
... and I am connected to a <class '__main__.A2'>:
I am an A2
>>> B().about()
I am a B
... and I am connected to no one!
>>>
调用super只会让您获得这种特殊的功能。代理对象是实例如何在技术上向上调用mro;按照Python2中的链接进行操作
文档。基于阅读更新的第二季度并再次查看第一季度,您似乎对课程以及它们可以为您做什么有一个基本的误解。这是有道理的,因为你说你是OOP新手 除非我知道您熟悉哪些非OOP语言,否则我将在这里与术语相冲突,但我将使用C示例,故意掩盖一系列问题,并声称您的类a类似于结构a,而您的类B只是一个包含整个结构a的结构B: 如果你创建了一个B的新实例,你不能改变它的a成员的类型,它总是一个实际的a。不管是否有结构A2类型或实例,B的内容只包括一个a 听起来你想要的根本不是一个子类,而只是一个普通的成员,在C中,它更像是一个指向其他对象的指针,而不是将其合并到一起:
class A1(object):
def __init__(self):
pass
def about(self):
print 'I am an A1'
class A2(object):
def __init__(self):
pass
def about(self):
print 'I am an A2'
class B(object):
def __init__(self, connected_to = None):
self.connected_to = connected_to
def about(self):
print 'I am a B'
if self.connected_to is not None:
print '... and I am connected to a %s:' % type(self.connected_to)
self.connected_to.about() # and ask it to describe itself
else:
print '... and I am connected to no one!'
在C中,至少有一个指针,如果它是void*-意味着你可以指向你需要的任何类型,或者什么都不指向,就像上面的a B可以连接到None,而不是A1或A2,或者任何东西,只要它有
鉴于上述情况,您可以执行以下操作:
>>> B(A1()).about()
I am a B
... and I am connected to a <class '__main__.A1'>:
I am an A1
>>> B(A2()).about()
I am a B
... and I am connected to a <class '__main__.A2'>:
I am an A2
>>> B().about()
I am a B
... and I am connected to no one!
>>>
调用super只会让您获得这种特殊的功能。代理对象是实例如何在技术上向上调用mro;按照Python2文档中的链接进行操作。您没有在B中调用uuu init_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。在这里打印非常好,self.uuuuuuuuuuuuuuu@user2290820是的,uuuu init_uuuuuuuuuu是一个function@user2290820如果我有一个函数测试,并且我用Python进行测试,我只得到那个函数对象。如果我使用参数进行潜在测试,我实际上会调用该函数。@Lattyware请注意属性。x、 如果在测试函数上使用@property装饰器或让test=property。。。在班里。当然,这只意味着人们编写有副作用的getter…你不是在B中调用uuu init_uuu。uuu init_uuu-调用函数需要括号。@Lattyware我不明白。在这里打印非常好,self.uuuuuuuuuuuuuuu@user2290820是的,uuuu init_uuuuuuuuuu是一个function@user2290820如果我有一个函数测试,并且我用Python进行测试,我只得到那个函数对象。如果我使用参数进行潜在测试,我实际上会调用该函数。@Lattyware请注意属性。x、 如果在测试函数上使用@property装饰器或让test=property。。。在班里。当然,这只意味着人们编写具有副作用的getter…从技术上讲,至少在Python 3中,所有类都是元类类型的实例,除非为Python 3中的类声明提供了元类参数metaclass named parameter,_uuu元类uuuuuu在Python 2的类主体中的插槽,在这种情况下,类将是元类的实例。有趣的是,类型本身就是一个实例。@user2290820这是一个新问题,应该在新问题中提出,而不是编辑成这个问题。从技术上讲,至少在Python 3中,所有类都是元类类型的实例,除非为Python 3中的类声明提供了一个元类参数metaclass named parameter,在Python 2的类体中,在这种情况下,类将是元类的实例。有趣的是,类型本身是一个实例。@user2290820这是一个新问题,应该在SO上的新问题中询问,而不是编辑到此问题中。忽略子实例。让我重新措辞。当数学=A时,代数=B。这里是一个新的类,不在上面,它根据数学从用户那里获得某些属性。对于英语,它们可能在意义上有所不同,属性可以被动态更改,但这不是这里的上下文。这意味着我想创建代数=B,但是代数类实例应该有一个机制来检查数学是否存在,就像数学=a一样。另一种说法是,有没有办法检查B类中的一个类的实例是什么?或者实例?忽略子实例。让我重新措辞。当数学=A时,代数=B。这里是一个新的类,不在上面,它根据数学从用户那里获得某些属性。对于英语,它们可能在意义上有所不同,属性可以被动态更改,但这不是这里的上下文。这意味着我想创建代数=B,但是代数类实例应该有一个机制来检查数学是否存在,就像数学=a一样。另一种说法是,有没有办法检查B类中的一个类的实例是什么?或者是实例?是的,这个对象到对象的连接就是我要寻找的。定义类的实例,这些类有子类,但只使用它们实例中的数据。我希望你明白我在这里所说的道理。这个对象对对象的连接就是我所寻找的。例如 具有子类但仅包含来自其实例的数据的类的集合。我希望你明白我在这里的意思