假设在一些模块parents.py
中有两个具有相同接口的父类class Mother:
def __init__(self):
print("mother")
class Father:
def __init__(self):
print("father")
并且您想要使用子类,它可以在两个类上运行,例如
import parents
class Child:
def __init__(self,parent_choice):
parents.parent_choice.__init__()
是否可以创建这样的子对象,选择正确的父对象作为变量?
之类的东西import child
son_of_your_mother = Child(Mother)
最好的方法是为每个父母提供单独的模块(.py文件)(不是我的例子中所示)。 任何其他解决这个问题的方法都是受欢迎的,只要它将两个父类分开(离婚通常对孩子们有好处)。
答案 0 :(得分:1)
将母亲和父亲定义为子属性,将两者保留为母亲和父对象实例的引用(具有关系)
class Mother:
...
class Father:
...
class Child:
def __init__(self, mother, father):
self.mother = mother
self.father = father
...
...
# use whatever attributes/methods you want from mother or father with
# self.mother.somethod() or self.father.someattribute
mother1 = Mother() # create real objects from your classes
father1 = Father()
child1 = Child(mother1, father1) # pass them to the child `__init__`
你保持母亲和父亲的课程是无关紧要的。您可以将它们保存在同一个文件中,也可以创建family.py
模块然后
from family import Mother, Father
class Child:
...
在当前脚本中定义您的孩子。
编辑:
根据您的意见,您需要从某个Child
类继承Parent
类,您也可以从该类继承Mother
和Father
类。
这将继承方法和属性,但也会声明Child
也是Parent
,而他不是。Person
。但是他们都是人,所以你可以创建一个具有共同属性和方法的__init__
类,使用继承自Person的Mother和Father类扩展它,然后改变子类add_parent
以接收父母的名单。你保持一个像容器一样的关系,但现在一个孩子可以有很多父母。也许添加一个方法self.parents
,将新父母添加到Child
中的该列表中。如果在Child
中创建方法只是委托(调用)父对象中的相应方法变得非常繁琐,那么您可以考虑将 <!HTML>
<!DOCTYPE html>
<meta charset=utf-8 />
<script src="video.js" type="text/javascript"></script>
<title>Video streaming</title>
<h1> <marquee>Streaming </marquee></h1>
<center>
<h1> Choisir video </h1>
<!select another Local video>
<select onChange="javascript:loadAnotherVideo(this.value);">
<option class="item" value="video2.MP4"> 1er Video</option>
<option class="item" value="IMAG0008.MP4">2eme video</option>
<option class="item" value=" video.webm">3eme video</option>
</select>
<! Select another video by URL>
<p>
<form id='ui'>
<fieldset>
<input id='url' name='url' type='text' placeholder="C:\Users\PC MC\Desktop\projetMPA\video2.MP4">
<button id='syn' type='button'>Soummetre</button><br>
<label>Chemin de votre Video:</label><br>
<output id='view'></output>
</fieldset>
</form>
</p>
<h1> Choisir effet </h1>
<!choose effect>
<span id="cvsModeLbl">Mode:</span>
<input type="button" id="cvsbtnNormal" value="Normal" onclick="myFunction();"/>
<input type="button" id="cvsbtnBW" value="Black & White" onclick="myFunction1();"/>
<!myvideo>
<h1> Vidéo Side by side</h1>
<video crossOrigin="anonymous" id='v' controls loop width="500" height="400">
<source src=video2.mp4 type=video/mp4>
<source src=video2.webm type=video/webm>
<source src=video2.ogg type=video/ogg>
</video>
<canvas id=c width="500" height= "400"></canvas>
</center>
<script>
// fonction video LOcal
function loadAnotherVideo(src) {
var video = document.getElementsByTagName('video')[0];
var sources = video.getElementsByTagName('source');
sources[0].src = src;
video.width="600";
video.height="500"
document.getElementById('c').width = video.width;
video.load();
}
//fonction URL
var UI = document.forms.ui;
// Set click event on form--have it run init() when clicked
UI.addEventListener('click', init, false);
function init(e) {
var video = document.getElementsByTagName('video');
// Reference all fom controls of #ui
var ui = e.currentTarget.elements;
// Get the value of #url
var url = ui.url.value || null;
// afficher mon lien en dessous
ui.view.innerHTML = url;
var vid = document.querySelector('#v');
// Set its src to value of url
vid.src = url;
// load video tag
vid.load();
}
// recupération de la donnée video
var v = document.getElementById('v');
//recupération du canvas
var canvas = document.getElementById('c');
//creation du context du canvas
var context = canvas.getContext('2d');
var back = document.createElement('canvas');
var backcontext = back.getContext('2d');
var cw,ch;
cw = v.width;
ch = v.height;
back.width=cw;
back.hight=ch;
back1.width=cw;
back1.height=ch;
console.info('canvas.width', cw);
console.info('canvas.width', back.width);
// fonction normal
function myFunction(){
context.clearRect(0,0,500,400);
// First, draw it into the backing canvas
context.drawImage(v,0,0,cw,ch);
//setTimeout(function(){ myFunction() }, 10);
requestAnimationFrame(myFunction);
}
//fonction noir et blanc
function myFunction1(){
context.clearRect(0,0,500,400);
context.drawImage(v,0,0,cw,ch);
// Grab the pixel data from the backing canvas
var idata = context.getImageData(0,0,cw,ch);
var data = idata.data;
// Loop through the pixels, turning them grayscale
for(var i = 0; i < data.length; i+=4)
{
var r = data[i],
g = data[i+1],
b = data[i+2],
gray = (r+g+b)/3;
data[i] = gray;
data[i+1] = gray;
data[i+2] = gray;
}
idata.data = data;
// Draw the pixels onto the visible canvas
context.putImageData(idata,0,0);
// Start over!
//setTimeout(function(){ myFunction1(); }, 10);
requestAnimationFrame(myFunction1);
}
}
类更改为继承Person类,获取所有常见的Parents机制。你需要在这些场景中调整一些代码,但我认为你得到了它。
答案 1 :(得分:0)
我发现了一个非常相似的问题:Pass a parent class as an argument?
解决方案是定义一个包装类的函数。在这种情况下会像
import parents
def Child(parent):
class Child(parent):
# stuff
return Child
并创建实例
import child
c = Child(Mother)(**args)
答案 2 :(得分:0)
您可以将字符串传递给transformM
,然后使用getattr创建父对象。
Child
然后你会像这样使用它
import parents
class Child:
def __init__(self,parent_choice):
self.parent = getattr(parents, parent_choice)()