Python:父类作为变量

时间:2018-02-22 14:36:59

标签: python class parent-child

假设在一些模块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文件)(不是我的例子中所示)。 任何其他解决这个问题的方法都是受欢迎的,只要它将两个父类分开(离婚通常对孩子们有好处)。

3 个答案:

答案 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类,您也可以从该类继承MotherFather类。 这将继承方法和属性,但也会声明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 &amp; 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)()