我对python很新,并注意到这些帖子: Python __init__和self他们做了什么?和 Python类没有使用def __init __(self)
然而,在玩完它之后,我注意到这两个类别给出了明显相同的结果 -
class A(object):
def __init__(self):
self.x = 'Hello'
def method_a(self, foo):
print self.x + ' ' + foo
Run Code Online (Sandbox Code Playgroud)
(来自这个问题)
和
class B(object):
x = 'Hello'
def method_b(self,foo):
print self.x + ' ' + foo
Run Code Online (Sandbox Code Playgroud)
这两者之间有什么真正的区别吗?或者,更一般地说,是否确实__init__
改变了关于类的属性的任何内容?在文档中提到了__init__
在创建实例时调用的文档.这是否意味着在实例化之前建立x
了类B
?
以下看起来很奇怪..基本上,somedata属性似乎在所有继承的类之间共享the_base_class
.
class the_base_class:
somedata = {}
somedata['was_false_in_base'] = False
class subclassthing(the_base_class):
def __init__(self):
print self.somedata
first = subclassthing()
{'was_false_in_base': False}
first.somedata['was_false_in_base'] = True
second = subclassthing()
{'was_false_in_base': True}
>>> del first
>>> del second
>>> third = subclassthing()
{'was_false_in_base': True}
Run Code Online (Sandbox Code Playgroud)
self.somedata
在__init__
函数中定义显然是解决这个问题的正确方法(所以每个类都有它自己的somedata
dict) - 但什么时候这种行为是可取的?
我有兴趣听一些关于Python中类属性的讨论.例如,类属性的一个很好的用例是什么?在大多数情况下,我无法想出一个类属性比使用模块级属性更可取的情况.如果这是真的,那么为什么要将它们放在一边?
我遇到的问题是,错误地破坏类属性值几乎太容易了,然后你的"全局"值变成了本地实例属性.
请随意评论您将如何处理以下情况:
一些相关帖子:
类和实例属性之间的差异
这里我有一个属性'a',它在第一类方法中定义,应该在第二类中更改.按顺序调用它们时,会显示以下消息:
AttributeError:'Class'对象没有属性'a'
我找到的唯一方法 - 在第二种方法中再次定义'a',但在实际代码中它有很长的继承和应用程序将被混乱.为什么不起作用?不是self.a等于Class.a?
class Class(object):
def method_1(self):
self.a = 1
def method_2(self):
self.a += 1
Class().method_1()
Class().method_2()
Run Code Online (Sandbox Code Playgroud) 有人可以向我解释下面的代码.
class InnerTest:
def __init__(self, value = 0):
self.value = value
class OuterTest:
def __init__(self, inner_test = InnerTest()):
self.inner_test = inner_test
a = OuterTest()
b = OuterTest()
a.inner_test.value = 42
print b.inner_test.value
Run Code Online (Sandbox Code Playgroud)
它打印42,我预计0.
我打算创建两个OuterTest实例,每个实例都包含一个不同的InnerTest实例.相反,我得到了两个引用同一个InnerTest实例的OuterTest实例.
还有什么是正确的方法来实现我想要的东西?
我试图打印一个包含列表作为属性的python对象列表,我有一些意想不到的结果:
这是我的代码:
class video(object):
name = ''
url = ''
class topic(object):
topicName = ''
listOfVideo = []
def addVideo(self,videoToAdd):
self.listOfVideo.append(videoToAdd)
def getTopic(self):
return self.topicName
def getListOfVideo(self):
return self.listOfVideo
topic1 = topic()
topic1.topicName = 'topic1'
video1 = video()
video1.name = 'VideoName1'
video1.url = 'VideoURL1'
video2 = video()
video2.name = 'VideoName2'
video2.url = 'VideoURL2'
topic1.addVideo(video1)
topic1.addVideo(video2)
topic2 = topic()
topic2.topicName = 'topic2'
video3 = video()
video3.name = 'VideoName3'
video3.url = 'VideoURL3'
video4 = video()
video4.name = 'VideoName4'
video4.url = 'VideoURL4'
topic2.addVideo(video3) …
Run Code Online (Sandbox Code Playgroud) 我想在每个表单中显示db查询的标题和描述,但我不希望它在charfield中,我希望它是html格式的文本.
示例模板代码:
{% for form, data in zipped_data %}
<div class="row">
<div class="first_col">
<span class="title">{{ data.0 }}</span>
<div class="desc">
{{ data.1|default:"None" }}
</div>
</div>
{% for field in form %}
<div class="fieldWrapper" style="float: left; ">
{{ field.errors }}
{{ field }}
</div>
{% endfor %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
这是最惯用的方式吗?或者,有没有办法添加不会在textarea或文本输入中显示的文本到我的模型:
class ReportForm(forms.Form):
comment = forms.CharField()
Run Code Online (Sandbox Code Playgroud)
?
我做了两个名为House and Window的课程.然后,我列出了包含四个房屋的清单.House的每个实例都有一个Windows列表.我正在尝试遍历每个房子的窗户并打印它的ID.但是,我似乎得到了一些奇怪的结果:S我非常感谢任何帮助.
#!/usr/bin/env python
# Minimal house class
class House:
ID = ""
window_list = []
# Minimal window class
class Window:
ID = ""
# List of houses
house_list = []
# Number of windows to build into each of the four houses
windows_per_house = [1, 3, 2, 1]
# Build the houses
for new_house in range(0, len(windows_per_house)):
# Append the new house to the house list
house_list.append(House())
# Give the new house an ID
house_list[new_house].ID = str(new_house) …
Run Code Online (Sandbox Code Playgroud) 我是python的新手,并且知道类属性就像C++中的静态数据成员一样.但是,在尝试以下代码后我感到困惑:
>>> class Foo:
... a=1
...
>>> f1=Foo();
>>> f2=Foo()
>>> f1.a
1
>>> f1.a=5
>>> f1.a
5
>>> f2.a
1
Run Code Online (Sandbox Code Playgroud)
f2.a也不应该等于5吗?
如果a被定义为列表而不是整数,则行为是预期的:
>>> class Foo:
... a=[]
...
>>> f1=Foo();
>>> f2=Foo()
>>> f1.a
[]
>>> f1.a.append(5)
>>> f1.a
[5]
>>> f2.a
[5]
Run Code Online (Sandbox Code Playgroud)
我看了 Python:类和实例属性之间的区别,但它没有回答我的问题.
谁能解释为什么会有区别?谢谢
我正在使用RawConfigParser
来读取和更新 ini 样式的配置文件。这在标准配置中完全没有问题。我的问题是我在同一个脚本中读取不同的配置文件。无需过多赘述,当我阅读第二个配置文件时,它的值与第一个 ini 文件合并。
两个 ini 文件的原始内容
infile_1.ini
[section]
option = Original value
extraoption = not in ini file 2
inifile_2.ini
[section]
option = Original value
Run Code Online (Sandbox Code Playgroud)
这是我用来更改 ini 文件内容的代码。这是重现问题的一小段代码
import ConfigParser
class status_file:
myConfig = ConfigParser.RawConfigParser()
myConfig.optionxform = str
def __init__(self, str_statusfile):
self.myConfig.read( str_statusfile)
self.statusfile = str_statusfile
def option(self, new_value):
self.myConfig.set("section","option",new_value)
with open( self.statusfile, "w") as ini_out:
self.myConfig.write( ini_out )
statusfiles = ['inifile_1.ini', 'inifile_2.ini']
for myStatus in statusfiles:
myConfig = status_file(myStatus)
myConfig.option("Something new")
Run Code Online (Sandbox Code Playgroud)
执行此代码后,ini 文件的内容已按预期更改。但是在第二个 ini 文件中,合并了第一个 …
python ×10
class ×4
attributes ×2
class-design ×1
configparser ×1
django ×1
django-forms ×1
inheritance ×1
instance ×1
module ×1
oop ×1