对象和类
对象就是对数据的抽象。每个对象都将具有id、type、value三个属性
id表示内存地址,可以通过内置函数id()
查看,而type表示对象的类别,不同的类别意味着该对象拥有的属性和方法等,可以通过type()
来查看
对象既包含数据也包含代码,他是某一类具体事物的特殊实例
一些内置对象:数字——直接使用阿拉伯数字。字符串——''
,列表——[]
.字典——{}
函数——def
语法
类与实例
用class
定义类(类对象),与其他对象不同的是,class定义的对象可以用于产生新的对象
class Person():
pass
def who(obj):
print(id(obj), type(obj))
someone = Person()
who(someone)
在这个当中,person是我们创建的一个新类,通过调用person()可以获得一个person类型的实例对象,我们可以将其赋值为someone,就成功创建了一个与所有内置对象类型不同的对象someone,他的类型为__main__.person
.到这里我们可以将python中的一切对象分为俩两种
- 可以用来生成新对象的类,包括内置的int、str以及上面定义的person等
- 由类生成的实例对象,包括内置类型的数字、字符串、以及上面定义的类型为
__main__.person
的someone
在实践中不得不考虑的一些细节性的问题:
- 需要一些方便的机制来实现面向对象编程中的继承、承载等待型
- 需要一些固定的流程让我们可以在生成实例化对象的过程中执行一些特定的操作
类的方法
初始化方法:__init__
传入一个self,一个name
继承
从已有类的衍生出新的类,添加或修改部分功能,能提高代码复用。使用继承得到的新类会自动获得旧类中的所有方法,而不需要进行复制
class A():
def foo(self):
print('A.foo')
class B(A):
def foo(self):
"""覆盖父类中的方法
"""
# 使用super()调用父类的方法
super().foo()
print('B.foo')
def bar(self):
"""在子类中添加父类中没有的新方法
"""
print('B.bar')
a = A()
a.foo()
b = B()
b.foo()
b.bar()
#A.foo
#A.foo
#B.foo
#B.bar
在类中封装属性名
python中类的所有特型都是公开的,我们通过一定的属性和命名规约来达到封装
第一个预定就是任何
以但下划线_开头的名字都应该是内部实现的。但是python并不会真正的阻止访问内部名称。但这样做会影响代码。而使用双下划线__
会导致访问名变成其他形式
方法类型
在类中定义的方法有三种:
- 实例方法,以self作为第一个参数,当其被调用时,python会把调用该方法的对象作为self参数传入
- 类方法:用
@classmethod
装饰器指定,第一个参数是类本身,通产写作cls,作用于整个类,对类作出的任何改变会对他的所有实例对象产生影响 - 静态方法:
@staticemethod
修饰,其参数既不需要self也不需要cls,其功能既不影响类也不影响类的实例,仅仅为了组织代码的方便
常用魔术方法
__lt__(self, other) self < other
__le__(self, other) self <= other
__eq__(self, other) self == other
__ne__(self, other) self != other
__gt__(self, other) self > other
__ge__(self, other) self >= other
__add__(self, other) 加法 +
__sub__(self, other) 减法 -
__mul__(self, other) 乘法 *
__floordiv__(self, other) 整数除法 //
__truediv__(self, other) 真除法 /
__mod__(self, other) 取模算法 %
__divmod___(self, other) 内置divmod()函数
__pow__(self, other) 指数运算 **
__lshift__(self, other) 左移 <<
__rshift__(self, other) 右移 >>
__and__(self, other) 按位与 &
__or__(self, other) 按位或 |
__xor__(self, other) 按位异或 ^
__str__(self)=str(self)——打印对象信息
__repr__(self)=repr(self)——交互式解释器适用此方法
__len__(self)=len(self)