Python 3.2以防万一...
以下代码显示"具体类"可以将some_method实现为静态方法或实例方法:
import abc
class SomeAbstractClass(metaclass=abc.ABCMeta):
@abc.abstractmethod
def some_method(self): pass
class ValidConcreteClass1(SomeAbstractClass):
@staticmethod
def some_method():
print("foo!")
class ValidConcreteClass2(SomeAbstractClass):
def some_method(self):
print("foo!")
ValidConcreteClass1.some_method()
instance = ValidConcreteClass2()
instance.some_method()
Run Code Online (Sandbox Code Playgroud)
我的问题是,我可以强制some_method的实现在继承类中是静态的吗?
我注意到了@ abc.abstractstaticmethod,并认为这是答案,但以下代码仍然可以正常运行.我认为它会拒绝ValidConreteClass2,因为some_method不是静态的:
import abc
class SomeAbstractClass(metaclass=abc.ABCMeta):
@abc.abstractstaticmethod
def some_method(self): pass
class ValidConcreteClass1(SomeAbstractClass):
@staticmethod
def some_method():
print("foo!")
class ValidConcreteClass2(SomeAbstractClass):
def some_method(self):
print("foo!")
ValidConcreteClass1.some_method()
instance = ValidConcreteClass2()
instance.some_method()
Run Code Online (Sandbox Code Playgroud) 我正在编辑原始问题,因为我们都专注于你应该做的事情.我的问题是我能做到这一点和如何(理解可能有几种解决方案).所以我只想离开实际问题并删除背景.
假设我有一个基类和一个子类.我可以在基类中做些什么来防止在子类上调用__init__ - 或者至少抛出一个异常甚至是日志,如果__init__存在或在子类上被调用?我确实希望在父类上调用__init__方法.
编辑/结论 - 在探索答案中提出的选项后,我认为这样做会很糟糕.我将以不同的方式解决我的问题.尽管如此,希望下面的答案有助于其他人想要这样做.
我受到了我和我的团队在我最近两家公司使用的日志级别的影响.我会在这里分享我们的,但请记住这一点是主观的:
现在,我的客观问题是在这方面是否存在高度一致的风格.答案可能是否定的.但如果有这样的标准,你能指出一个URL吗?
另请注意,我并不关心实际配置什么阈值来记录部署/生产环境中有用的地方.相反,我的问题仅限于我们这些编写代码的人应该使用的指南.
我在我的问题上放了一个C#标签和Java标签.我们可能在这两个阵营中有不同的指导方针,但可能只有文化原因我们不同,而不是概念上的原因.
我可能忽略了一些简单的事情.给定一个类的实例,我想得到类名.例如:
class Foooo: pass
instance = Foooo()
print("instance.__class__ = "+str(instance.__class__))
print("Just the class name: "+str(instance.__class__).split(".")[-1][:-2])
Run Code Online (Sandbox Code Playgroud)
这给出了以下输出:
instance.__class__ = <class '__main__.Foooo'>
Just the class name: Foooo
Run Code Online (Sandbox Code Playgroud)
有什么比这简单
str(instance.__class__).split(".")[-1][:-2]?
Run Code Online (Sandbox Code Playgroud)
如果有帮助的话,我在Python 3.2中
current_working_directory = os.getcwd()
relative_directory_of_interest = os.path.join(current_working_directory,"../code/framework/zwave/metadata/")
files = [f for f in os.listdir(relative_directory_of_interest) if os.path.isfile(os.path.join(relative_directory_of_interest,f))]
for f in files:
print(os.path.join(relative_directory_of_interest,f))
Run Code Online (Sandbox Code Playgroud)
输出:
/Users/2Gig/Development/feature_dev/scripts/../code/framework/zwave/metadata/bar.xml
/Users/2Gig/Development/feature_dev/scripts/../code/framework/zwave/metadata/baz.xml
/Users/2Gig/Development/feature_dev/scripts/../code/framework/zwave/metadata/foo.xml
Run Code Online (Sandbox Code Playgroud)
这些文件路径工作正常,但我想看到这些是绝对路径(没有任何../ - 我不知道为什么我关心,也许我是强迫症.我想我也觉得在登录时更容易看到标准python库(我在3.2)中是否有内置的东西可以将它们变成绝对路径?如果不是,那就没什么大不了的,但是一点点谷歌搜索只发现了第三方解决方案.
编辑:看起来像我想要的os.path.abspath(文件))所以上面的修改后的源码现在看起来像(不是我没有测试这个,它只是袖口):
current_working_directory = os.getcwd()
relative_directory_of_interest = os.path.join(current_working_directory,"../code/framework/zwave/metadata/")
files = [f for f in os.listdir(relative_directory_of_interest) if os.path.isfile(os.path.join(relative_directory_of_interest,f))]
for f in files:
print(os.path.abspath(f))
Run Code Online (Sandbox Code Playgroud)
输出:
/ Users/2Gig/Development/feature_dev/scripts/ZWave_custom_cmd_classes(08262010).xml/Users/2Gig/Development/feature_dev/scripts/ZWave_custom_cmd_classes(09262010).xml/Users/2Gig/Development/feature_dev/scripts/ZWave_custom_cmd_classes(09262011). XML
我看到一个键击来切断当前行,但没有什么可复制的.有人知道怎么做吗?
假设您执行以下操作:
dom = ElementTree()
dom.parse(some_file_path)
Run Code Online (Sandbox Code Playgroud)
我想在我的过程中记录这个dom现在使用的大量内存.我不需要精确的东西,粗糙的东西会做.
我不认为我可以从源XML文件的大小派生它.我有一个500千字节的文件似乎在我的python进程的内存使用量增加约5MB后,如上例所示加载它.
我查看了ElementTree API,但没有看到任何提供此信息的API.任何人都知道在解析/加载XML文件后知道ElementTree实例使用了多少内存的方法?
请考虑以下代码:
public class Foo
{
private static object _lock = new object();
public void NameDoesNotMatter()
{
if( SomeDataDoesNotExist() )
{
lock(_lock)
{
if( SomeDataDoesNotExist() )
{
CreateSomeData();
}
else
{
// someone else also noticed the lack of data. We
// both contended for the lock. The other guy won
// and created the data, so we no longer need to.
// But once he got out of the lock, we got in.
// There's nothing left to do.
} …Run Code Online (Sandbox Code Playgroud)