我无法找到明确的答案.AFAIK,你不能__init__在Python类中拥有多个函数.那么我该如何解决这个问题呢?
假设我有一个Cheese使用该number_of_holes属性调用的类.我怎样才能有两种创建奶酪对象的方法......
parmesan = Cheese(num_holes = 15)number_of_holes属性:gouda = Cheese()我只想到一种方法来做到这一点,但这似乎有点笨重:
class Cheese():
def __init__(self, num_holes = 0):
if (num_holes == 0):
# randomize number_of_holes
else:
number_of_holes = num_holes
Run Code Online (Sandbox Code Playgroud)
你说什么?还有另外一种方法吗?
为什么cls有时self在Python类中使用而不是作为参数?
例如:
class Person:
def __init__(self, firstname, lastname):
self.firstname = firstname
self.lastname = lastname
@classmethod
def from_fullname(cls, fullname):
cls.firstname, cls.lastname = fullname.split(' ', 1)
Run Code Online (Sandbox Code Playgroud) 是否不可能在Python中定义具有不同签名的多个构造函数?如果没有,绕过它的一般方法是什么?
例如,假设您想要定义一个类 City
我想能够说,someCity = City()或者someCity = City("Berlin"),第一个只提供默认名称值,第二个定义它.
在另一个问题中,接受的答案建议用try/except块替换Python代码中的(非常便宜的)if语句以提高性能.
抛开编码样式问题,并假设从未触发异常,与异常处理程序相比,具有异常处理程序(与性能相比)有多大差异,而不是具有比较为零的if语句?
我不是要求对这种哲学提出个人的"宗教"观点,而是要更具技术性.
我理解这句话是几个试金石中的一个,看你的代码是否是"pythonic".但对我来说,pythonic意味着干净,简单和直观,没有加载异常处理程序以进行错误的编码.
所以,实际的例子.我定义了一个类:
class foo(object):
bar = None
def __init__(self):
# a million lines of code
self.bar = "Spike is my favorite vampire."
# a million more lines of code
Run Code Online (Sandbox Code Playgroud)
现在,来自程序背景,在另一个函数中,我想这样做:
if foo.bar:
# do stuff
Run Code Online (Sandbox Code Playgroud)
如果我不耐烦并且没有做初始的foo = None,我会得到一个属性异常.所以,"请求宽恕不许可"表明我应该这样做吗?
try:
if foo.bar:
# do stuff
except:
# this runs because my other code was sloppy?
Run Code Online (Sandbox Code Playgroud)
为什么我在try块中添加额外的逻辑会更好,这样我可以让我的类定义更加模糊?为什么不先定义所有内容,然后明确授予权限?
(不要打扰我使用try/except块......我在任何地方都使用它们.我不认为用它们来捕捉我自己的错误是正确的,因为我不是一个彻底的程序员.)
或者......我是否完全误解了"请求原谅"的口头禅?
我有一个容纳数据的容器类.创建容器时,有不同的方法来传递数据.
在Java中,我将创建三个构造函数.以下是在Python中可能出现的情况:
class Container:
def __init__(self):
self.timestamp = 0
self.data = []
self.metadata = {}
def __init__(self, file):
f = file.open()
self.timestamp = f.get_timestamp()
self.data = f.get_data()
self.metadata = f.get_metadata()
def __init__(self, timestamp, data, metadata):
self.timestamp = timestamp
self.data = data
self.metadata = metadata
Run Code Online (Sandbox Code Playgroud)
在Python中,我看到了三个明显的解决方案,但它们都不是很漂亮:
答:使用关键字参数:
def __init__(self, **kwargs):
if 'file' in kwargs:
...
elif 'timestamp' in kwargs and 'data' in kwargs and 'metadata' in kwargs:
...
else:
... create empty container
Run Code Online (Sandbox Code Playgroud)
B:使用默认参数:
def …Run Code Online (Sandbox Code Playgroud) 我有一个AbstractDataHandle类,它的init方法和类Classifier.我想在Classifier中有两个构造函数,Java就像.一个继承自它的超类,一个全新的.
它会像(但我打算"保留"两个构造函数):
class AbstractDataHandle():
def __init__(self, elements, attributes, labels):
self._load(elements, attributes, labels)
class Classifier(AbstractDataHandle):
def __init__(self, classifier="LinearSVC", proba=False):
self._fit(classifier, proba)
Run Code Online (Sandbox Code Playgroud)
我可以在一个班级中拥有两个构造函数吗?如果是,我可以从超类继承构造函数,并添加一个新的构造函数吗?
先感谢您.
我有一个概念性的Python设计困境.
假设我有一个City类,它代表数据库中的一个城市.该City对象可通过两种方式进行初始化:
name,country,population,...),这将在数据库中生成一个新的城市,并检索其ID.这意味着City对象将始终具有ID - 初始化ID或从数据库派生的新创建ID.
经典的Java方法会使构造函数重载 - 一个构造函数将获得一个int参数,另一个构造函数将获得许多强类型参数.
get_city_id,并从中获得CityFromID并
CityFromNewData从它,但是这是一个很大的努力来解决这个语言空白.使用**kargs似乎非常不优雅,因为构造函数的签名没有明确说明所需的输入参数,文档字符串是不够的:
class City(object):
def __init__(self, city_id=None, *args, **kargs):
try:
if city_id==None:
self.city_id=city_id
else:
self.city_name=kargs['name']
except:
error="A city object must be instanciated with a city id or with"+\
" full city details."
raise NameError(error)
Run Code Online (Sandbox Code Playgroud)
是否有一个Pythonic,优雅的构造函数重载解决方案?
亚当
在过去的几个小时里,我一直在试图解决这个问题,我即将放弃.
你如何确保在python中只有匹配的特定条件才能创建对象?
例如,假设我想创建一个Hand对象,并且只有在初始化程序中有足够的Fingers时才初始化Hand?(请以此为例进行比喻)
说,
class Hand:
def __init__(self, fingers):
# make sure len(fingers)==5, and
#only thumb, index, middle, ring, pinky are allowed in fingers
pass
Run Code Online (Sandbox Code Playgroud)
谢谢.
这些是我发现的最接近的问题,但一个是C++,另一个不回答我的问题.
class fileDetails :
def __init__(self,host,usr,pwd,database):
self.host=host
self.usr.usr
self.pwd=pwd
self.database=database
def __init__(self,connection,sql,path):
self.connection=mysql_connection()
self.sql=sql
self.path=path
Run Code Online (Sandbox Code Playgroud)
如果我使用构造函数,那么它会给出一个错误:
onnetction = fileDetails('localhost',"root","",'bulsorbit')
TypeError: __init__() takes exactly 4 arguments (5 given)
Run Code Online (Sandbox Code Playgroud) class Session:
@staticmethod
def load_from_json(json_path:str) -> Session:
pass
Run Code Online (Sandbox Code Playgroud)
上面抛出一个NameError: name 'Session' is not defined. 在其定义中使用自身作为类型提示是不可能的吗?
python ×11
constructor ×5
class ×3
exception ×1
idiomatic ×1
inheritance ×1
init ×1
initializer ×1
object ×1
oop ×1
overloading ×1
parameters ×1
performance ×1
python-2.7 ×1
self ×1
terminology ×1
type-hinting ×1