我正在尝试学习 Python 中的面向对象编程,但我对如何返回类的实例有点困惑。
我所拥有的代码的一些背景: Contact 类应该有一个必需的(完整)姓名、零个或多个电话号码以及零个或多个联系人的电子邮件地址。AddressBook 类采用联系人列表(定义如上),并且“add_contact”方法假设即使在创建联系人后也会将联系人添加到地址簿中。
class Contact:
def __init__(self, name = None, addresses = False, email_addresses = False):
self.name = name
self.addresses = addresses
self.email_addresses = email_addresses
class AddressBook:
def __init__(self, contacts = []):
self.contacts = contacts
def add_contact(self,new_contact):
self.contacts.append(new_contact)
def contact_by_name(self, person):
return Contact(name = person)
Run Code Online (Sandbox Code Playgroud)
所以我想要实现的是“contact_by_name”方法将采用名称(字符串)并返回具有给定名称的联系人 - 即它返回 Contact 的实例。
例子:
julian = Contact(name="Julian Berman")
book = AddressBook(contacts=[julian])
Run Code Online (Sandbox Code Playgroud)
我想要的是:
book.contact_by_name("Julian Berman") == julian
Run Code Online (Sandbox Code Playgroud)
我尽力给出“contact_by_name”方法的代码,但它一直给我错误,有人可以发送帮助吗!谢谢!
我有一个模块,其中定义了一些常量,并在多个函数中使用。我如何从我的主文件中覆盖它们的值?
说这是模块,test_import.py
MY_CONST = 1
def my_func(var = MY_CONST):
print(var)
Run Code Online (Sandbox Code Playgroud)
这是我的main.py文件:
import test_import
MY_CONST = 2
test_import.MY_CONST = 3
test_import.my_func()
Run Code Online (Sandbox Code Playgroud)
这段代码仍然打印“1”。我希望它打印一些其他值(显然,在调用时不传递值my_func())
我对Python中的列表列表感到有些困惑.我有这两个片段:
li1 = [['a'], ['a'], ['a']]
print li1
for i in range(0, len(li1)):
li1[i] += [i]
print li1
li2 = [['a']] * 3
print li2
for i in range(0, len(li2)):
li2[i] += [i]
print li2
Run Code Online (Sandbox Code Playgroud)
创建后li1和li2是相同的,但是当我添加元素时,它们的行为有所不同:
[['a'], ['a'], ['a']]
[['a', 0], ['a', 1], ['a', 2]]
[['a'], ['a'], ['a']]
[['a', 0, 1, 2], ['a', 0, 1, 2], ['a', 0, 1, 2]]
Run Code Online (Sandbox Code Playgroud)
有人可以解释诀窍在哪里?
我有以下设置:
def returnList(arg=["abc"]):
return arg
list1 = returnList()
list2 = returnList()
list2.append("def")
print("list1: " + " ".join(list1) + "\n" + "list2: " + " ".join(list2) + "\n")
print(id(list1))
print(id(list2))
Run Code Online (Sandbox Code Playgroud)
输出:
list1: abc def
list2: abc def
140218365917160
140218365917160
Run Code Online (Sandbox Code Playgroud)
我可以看到arg = ["abc"]返回相同默认列表的副本,而不是每次都创建一个新列表.
我试过了
def returnList(arg=["abc"][:]):
Run Code Online (Sandbox Code Playgroud)
和
def returnList(arg=list(["abc"])):
Run Code Online (Sandbox Code Playgroud)
是否有可能获得一个新列表,或者每次我想要某种默认值时都必须在方法中复制列表?
Python 3.7.6(默认,2020 年 1 月 8 日,20:23:39)[MSC v.1916 64 位 (AMD64)]
my_list = ["a","b","c"]
dict_one = {key:[] for key in my_list}
print(dict_one)
{'a': [], 'b': [], 'c': []}
dict_two = dict.fromkeys(my_list, [])
print(dict_two)
{'a': [], 'b': [], 'c': []}
dict_one['a'].append('some_data')
dict_two['a'].append('some_data')
print(dict_one)
{'a': ['some_data'], 'b': [], 'c': []}
print(dict_two)
{'a': ['some_data'], 'b': ['some_data'], 'c': ['some_data']}
Run Code Online (Sandbox Code Playgroud)
我对 dict_one 和 dict_two 期望相同的结果。谁能解释一下区别?
这里有很多关于这类问题的讨论,但我没有看到任何关于如何实现这样一个函数的内容.
假设我有一个内部Foo()有函数的类bar().
该函数bar()接受no或只有一个参数.当它什么都没有时,属性被设置为2.否则,它被设置为输入的任何值.即
In [32]: foo = Foo()
In [33]: foo.bar()
In [34]: foo.a
Out [34]: 2
Run Code Online (Sandbox Code Playgroud)
和
In [32]: foo = Foo()
In [33]: foo.bar(5)
In [34]: foo.a
Out [34]: 5
Run Code Online (Sandbox Code Playgroud)
我该怎么做呢?