有什么区别:
class ClassName(object):
pass
Run Code Online (Sandbox Code Playgroud)
和
class ClassName:
pass
Run Code Online (Sandbox Code Playgroud)
当我调用那些类的模块的帮助功能时,你可以阅读____builtin____.object
CLASS标题下的第一个案例.对于第二种情况,它只显示类名.这些类和/或其可能的方法之间是否存在功能差异?
(我知道它class Classname(ParentClassName)
有功能用途)
怎么可能呢
class EmptyClass:
def __init__(self):
pass
e = EmptyClass()
e.a = 123
Run Code Online (Sandbox Code Playgroud)
工作和:
o = object()
o.a = 123
Run Code Online (Sandbox Code Playgroud)
没有(AttributeError: 'object' object has no attribute 'a'
)而
print isinstance(e, object)
>>> True
Run Code Online (Sandbox Code Playgroud)
?
什么是object()
好的,当你不能像这样使用它?
class Person(object):
pass
Run Code Online (Sandbox Code Playgroud)
class Person:
pass
Run Code Online (Sandbox Code Playgroud)
对象声明有什么作用?你应该用吗?我有两个程序都有这两个程序,并不知道它正在制造的差异.如果有人能解释这个概念请.
我们知道这会创建一个类:
class X:
a = 1
Run Code Online (Sandbox Code Playgroud)
并且,在Python 3中,由于使用了新的样式类,因此会X
自动从继承object
,但是在Python 2中,它不会:
>>> X.__bases__ # Python 2
()
>>> X.__bases__ # Python 3
(<class 'object'>,)
Run Code Online (Sandbox Code Playgroud)
而我们也知道,我们可以使用类工厂动态创建这样的一个类:
X = type("X",(object,), {"a":1})
name^ ^bases ^ "class" body
Run Code Online (Sandbox Code Playgroud)
然而,如果我们忽略了object
在基地的元组就像我们用做class
语法,我们继承object
的python3和,出乎意料的是,在python2还有:
X = type("X", ( ), {"a":1})
^ empty bases tuple
Run Code Online (Sandbox Code Playgroud)
>>> X.__bases__ # Python 2
(<type 'object'>,)
>>> X.__bases__ # Python 3
(<class 'object'>,)
Run Code Online (Sandbox Code Playgroud)
我期望X.__bases__
在python 2中是空的。
而且它不是这样的文档化功能,我几乎无法在Internet上找到有关此功能的信息。
实际上,python的官方文档 …
在我过去的一个问题中,一个回答者告诉我,当你想要创建的类是从头开始时,从对象继承是更好的,这不需要从其他类继承.
例如,像我一直做的那样:
class my_class:
"a class inherits from nothing"
def __init__(self):
pass
Run Code Online (Sandbox Code Playgroud)
对于他或她的建议:
class suggested_class(object):
"a class inherits from object type"
def __init__(self):
pass
Run Code Online (Sandbox Code Playgroud)
我对这两种方法的好处或缺点感到困惑.
问题1:
那么你的想法是什么,从对象类型继承还是什么都没有?
我想这是python 3.7(不确定)附带的,不仅可以将变量名传递给函数,还可以传递变量的类型。我想知道的是是否有可能传递特定类的类型。
你可以通过同样的方式:
def foo_func(i: int) -> None:
pass
Run Code Online (Sandbox Code Playgroud)
如果我有一堂课,让我们说:
class foo_class(object):
pass
Run Code Online (Sandbox Code Playgroud)
我怎样才能将 转换foo_func
为接收foo_class
而不是int
类型?
此外,如果 foo_class 是另一个类的继承,我可以从父类中强加一个更通用的类型吗?例如,如果我有,
class A(foo_class):
pass
class B(foo_class):
pass
Run Code Online (Sandbox Code Playgroud)
我怎么能通过A
或B
基于它的父母?
我的意思是这样的:
def foo_func(obj: foo_class_type) -> None:
pass
foo_func(A())
foo_func(B())
Run Code Online (Sandbox Code Playgroud) 当类从没有继承时,我有一个实例类型的对象.
>>> class A(): pass;
>>> a = A()
>>> type(a)
<type 'instance'>
>>> type(a) is A
False
>>> type(A)
<type 'classobj'>
Run Code Online (Sandbox Code Playgroud)
但是,当我从对象继承相同的类时,创建的对象是A的类型.
>>> class A(object): pass;
>>> a = A()
>>> type(a)
<class '__main__.A'>
>>> type(a) is A
True
>>> type(A)
<type 'type'>
Run Code Online (Sandbox Code Playgroud)
这背后的逻辑是什么?这是否意味着每个类都应该从对象继承?
什么是定义不需要任何构造函数参数的类的“Pythonic”方法?
class MyClass:
# class body
Run Code Online (Sandbox Code Playgroud)
或者我们需要一个显式的构造函数吗?IE
class MyClass:
def __init__:
pass
# class body
Run Code Online (Sandbox Code Playgroud) 有一段时间我看到一些类被定义为对象类的子类,如
class my_class(object):
pass
Run Code Online (Sandbox Code Playgroud)
如果与简单定义不同,如何呢?
class my_class():
pass
Run Code Online (Sandbox Code Playgroud) 我正在学习python并向OOP介绍自己.但是,我正在努力理解如何最好地构建类,特别是,以下类定义之间的差异以及何时应该使用每个类:
class my_class:
content...
class my_class():
content...
class my_class(object):
content...
Run Code Online (Sandbox Code Playgroud)
我一直在阅读非常有用的python在线帮助,虽然没有找到这个问题的具体答案.所以任何想法或推荐的参考将不胜感激,谢谢.
python ×9
class ×6
object ×4
inheritance ×3
oop ×3
python-2.7 ×2
arguments ×1
function ×1
pep8 ×1
python-3.7 ×1
python-3.x ×1
types ×1