使用python manage.py shell在django项目根目录下打开python shell,并观察以下内容:
>>> class A(object): pass #checking type of user-defined class
...
>>> type(A)
<type 'type'>
>>> class B(A): pass #checking type of child class
>>> type(B)
<type 'type'>
>>> from collections import OrderedDict #checking type of imported class
>>> type(OrderedDict)
<type 'type'>
Run Code Online (Sandbox Code Playgroud)
现在看看这个:
>>> from my_project.models import MyModel
>>> type(MyModel)
<class 'django.db.models.base.ModelClass'>
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下这里发生了什么吗?Django模型明确定义为models.py中的类:
class MyModel(models.Model):
pass
Run Code Online (Sandbox Code Playgroud)
那么为什么它们在进口时不属于"类型"?Django是通过一些黑色魔法改变模型类型的,还是我只是遗漏了一些明显的东西?
在Python中,我的印象datetime.date
基本上只是一个子集datetime.datetime
,具有更少的功能和更少的开销.我想永远不要再使用datetime.date
,原因如下:
这两种类型之间不再有转换!
datetime.date
由于显而易见的原因,对象始终是时区不知道的.这使得在整个应用程序中概括时区处理变得更加困难,如果有时您正在使用datetime.date
,有时您正在使用datetime.datetime
在很多情况下,我偶然遇到头痛,比较datetime.date
物体和datetime.datetime
物体.始终只使用一种类型使比较更简单.
格式化之间的差异datetime.date
,并datetime.datetime
应该是一个格式化的唯一问题.将差异进一步深入到底层类中会给语言带来不必要的复杂性.
如果我对这个在正确的轨道上,那么datetime.date
最终将在Python的未来版本过时了,就像unicode
和long
已.现在采用这个惯例使我领先于曲线.
在我看来,继续使用的唯一令人信服的论点datetime.date
是涉及的少量额外内存和存储datetime.datetime
.让我们说我不关心这个额外的开销.有没有其他非常令人信服的理由继续使用这门课程?我不想切换到这个惯例,然后后悔,因为我错过了一些重要的事情.
我喜欢使用collections.OrderedDict有时我需要一个关联数组,其中应该保留键的顺序.我有这个的最好的例子是解析或创建csv文件,其中将列的顺序隐式保留在对象中是有用的.
但是我担心这是不好的做法,因为在我看来,关联数组的整个概念是键的顺序永远不重要,并且依赖于排序的任何操作都应该只使用列表,因为这就是为什么列表存在(这可以在上面的csv示例中完成).我没有这方面的数据,但我愿意打赌,列表的性能普遍优于OrderedDict.
所以我的问题是:OrderedDict有没有真正引人注目的用例?csv用例是一个很好的例子,它应该在哪里使用还是坏的?
在 Python 中,dict 对象有一个“pop”方法,它返回并从 dict 中删除一个键,如果键不存在,则有一个可选的默认值。
对一般对象属性执行此操作的最佳方法是什么?
我在想:
my_obj.__dict__.pop('key_name', default)
Run Code Online (Sandbox Code Playgroud)
应该是一个不错的选择,但我担心直接静音对象的dict可能会产生我不知道的意外副作用。有更好的选择吗?
Python类具有这个简洁的功能,您可以使用@property
装饰器修饰类方法,这使得该方法显示为静态值成员而不是可调用成员.例如,这个:
class A(object):
def my_method(self):
return "I am a return value."
@property
def my_property(self):
return "I am also a return value."
Run Code Online (Sandbox Code Playgroud)
导致以下行为:
>>> a = A()
>>> a.my_method()
'I am a return value.'
>>> a.my_property
'I am also a return value.'
Run Code Online (Sandbox Code Playgroud)
最后,我的问题是:是否有任何内置语法在ES6类中提供类似的行为?我还不是文档专家(但是)到目前为止我没有看到任何提供此类功能的内容.
在Python中使用selenium webdriver编写了一个简单的测试函数:
from selenium import webdriver
def test_webdriver():
web = webdriver.PhantomJS()
web.get('http://example.com')
web.find_element_by_tag_name('html')
web.find_element_by_tag_name('head')
web.find_element_by_tag_name('meta')
web.find_element_by_tag_name('body')
web.find_element_by_tag_name('title')
web.find_element_by_tag_name('p')
web.find_element_by_tag_name('div')
Run Code Online (Sandbox Code Playgroud)
这个函数花了比预期更长的时间来运行,所以我用cProfile对它进行了分析,看到了一些这样的行:
ncalls tottime percall cumtime percall filename:lineno(function)
...
9 0.000 0.000 0.157 0.017 .../python2.7/urllib2.py:386(open)
...
Run Code Online (Sandbox Code Playgroud)
这清楚地表明webdriver正在我的测试功能中的每次 find
调用中访问网络.
我认为webdriver一次只抓取一次DOM get()
,然后在本地搜索和操作它,类似于BeautifulSoup.显然它不是那样工作所以我留下了一些问题:
find
,只是没有任何意义.注意:我知道测试页面上的javascript可能会触发非预期的网络呼叫,这就是我使用http://example.com作为我的测试页面的原因,以消除这种可能性.
python ×6
date ×1
datetime ×1
django ×1
ecmascript-6 ×1
javascript ×1
oop ×1
phantomjs ×1
selenium ×1
webdriver ×1