鱼C论坛

 找回密码
 立即注册
查看: 2828|回复: 6

[已解决]请问python能创建多个构造函数吗

[复制链接]
发表于 2018-4-25 22:39:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本人初学者,想尝试用python写一个函数,需要带两个或三个参数的那种。
        比如在java中(如下代码),可以构建某个类,类的构造方法可以传一个参数,或者两个参数。
        在python中有类似的用不同的构造函数来实现同名方法而参数个数不同或是参数类型不同的操作吗?

public void class Test {
        int x;
        int y=10;
        public Test (int x, int y){
        this.x=x;
        this.y=y;
}
        public Test(int x){
        this.x=x;
}
        public Test(double z){
        this.z=z;
}
}
Test test1=new Test(1,2);
Test test2=new Test(1);
Test test3=new Test(3.14);
最佳答案
2018-4-25 23:08:24
本帖最后由 ABC23 于 2018-4-25 23:11 编辑

在Java中,可以重载构造方法;但是Python中一个类最只能有一个__init__()方法
=================================================
1. 实例一

>>> class Demo:
        def __init__(self):
                print('0 args given...')
        def __init__(self, a):
                print('1 args given...')
        def __init__(self, a, b):
                print('2 args given...')
        def __init__(self, a, b, c):
                print('3 args given...')

               
>>> d = Demo()
Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    d = Demo()
TypeError: __init__() missing 3 required positional arguments: 'a', 'b', and 'c'

前面写的两个初始化方法被覆盖了,最后该类的初始化方法就是第三个
==================================================
2. 实例二

'
>>> class Demo(object):
        pass

>>> d = Demo()
>>> dir(d)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
>>> d.__dict__={'value':1}
>>> dir(d)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'value']

没有初始化就没有初始化,没关系。Python的动态语言可以动态绑定,这里让__dict__增加一个value域,它是实例d特有的。

楼上都误解楼主的意思了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-4-25 22:50:36 | 显示全部楼层
本帖最后由 thexiosi 于 2018-4-25 22:51 编辑

hi  有的,举个栗子,希望本人没理解错 :)
class A():
        def __init__(self,a,b,c): #构造函数__init__()  小甲鱼老师的魔法方法章节专门讲这些构造函数
                self.a = a
                self.b = b
                self.c = c

        def get(self):
                print(self.a,self.b,self.c)

>>> tmp = A('Hello','World', 666)
>>> tmp.get()
Hello World 666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-25 22:59:30 | 显示全部楼层
def func(*args):
    return args

>>> func(1)
(1,)
>>> func('1')
('1',)
>>> func(1.1)
(1.1,)
>>> func(1,2,3,4)
(1, 2, 3, 4)
>>> func([1,2,3])
([1, 2, 3],)
>>> func([1,2],2.3,'chakyam',True,None)
([1, 2], 2.3, 'chakyam', True, None)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-25 23:08:24 | 显示全部楼层    本楼为最佳答案   
本帖最后由 ABC23 于 2018-4-25 23:11 编辑

在Java中,可以重载构造方法;但是Python中一个类最只能有一个__init__()方法
=================================================
1. 实例一

>>> class Demo:
        def __init__(self):
                print('0 args given...')
        def __init__(self, a):
                print('1 args given...')
        def __init__(self, a, b):
                print('2 args given...')
        def __init__(self, a, b, c):
                print('3 args given...')

               
>>> d = Demo()
Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    d = Demo()
TypeError: __init__() missing 3 required positional arguments: 'a', 'b', and 'c'

前面写的两个初始化方法被覆盖了,最后该类的初始化方法就是第三个
==================================================
2. 实例二

'
>>> class Demo(object):
        pass

>>> d = Demo()
>>> dir(d)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
>>> d.__dict__={'value':1}
>>> dir(d)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'value']

没有初始化就没有初始化,没关系。Python的动态语言可以动态绑定,这里让__dict__增加一个value域,它是实例d特有的。

楼上都误解楼主的意思了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-25 23:11:49 | 显示全部楼层
Python本身就是鸭子类型,不需要重载
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-25 23:34:43 | 显示全部楼层
额,好吧,我直接说下我的具体问题吧。我其实是要算一个距离。效果就是DistanceCalculation(double x, double y) 是用计算一个结果,最后打印输出。但是这个函数体里会有个默认的隐藏属性(杆的长度) int z=35 , 默认的。如果要改这个长度,就需要调用三个参数的构造方法,即DistanceCalculation(double x, double y, int z)  .  具体来说就是这样一个方法体,其实用带三个参数的方法体就好了,但是z 在大部分情况都是默认的,所以想要用两个构造方法去实现这个函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-25 23:45:23 | 显示全部楼层
def calc(x, y, z=35):
    # method body
没必要重载
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 22:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表