Python面向对象:类

Class

  类作为一种数据结构,可以用来定义对象,把数据值和行为特性融合在一起.类是现实世界的抽象的实体以编程形式出现.实例是这些对象的具体化.比如说:类好比是蓝图或者模型,实例就是根据蓝图产生的真实物体.类还以派生出相似但是有差异的子类.在Python中一切皆为对象,类也是对象,但是正在被定义的类还不是对象.

1.创建类
  类使用关键字class来创建,类的声明是关键字后紧跟的类名:

class ClassName(bases):
    'class documentation string' # 类文档字符串
    class_suite # 类体

  bases是一个基类,基类是一个或多个用于继承的父类的集合.类体包含所有的声明语句,类成员的定义,数据属性和类方法组成.类的定义一般在模块的顶层进行定义,以便类实例能够在类所定义的文件中任何地方可以被创建.

1.2.类的声明与定义
  在Python中,类的定义与声明没什么区别,因为他们几乎是同时进行的,类的文档字符串必须是紧跟在类的声明之后,在类体的定义之前.

2.1.类的属性
  属性是属于一个对象的数据或者函数元素,可以通过句点.属性标识法来访问.比如字典类型,dict.key,dict.value,关于属性,被访问的属性,它也是一个对象,它也可以拥有自己的属性,也可以通过.来访问,这会产生一个属性链,比如:print(MyModule.MyClass._doc_)
  类的属性仅仅与其被定义的类绑定,当实例被创建时,实例会继承类的数据属性和方法属性,但是实例属性是一种'动态'的,可以任意增删改.但是类的属性不会因为实例对属性的修改而改变.类的数据属性就像是一种'静态'的.它不会因为函数调用完毕而消失,它对于类的每一个实例来说都是固定的.
2.2.类的数据属性
  数据属性是指类中定义的变量.跟其他变量一样在类创建后可以被使用,可以由类中的方法来更新.类的数据属性即:静态变量或者叫做静态数据.这些数据也是与它们所属的类对象绑定的,不依赖任何类实例.在C++中相当于在变量前加了static关键字.静态变量通常用来跟踪与类相关的值.但是大部分情况下,你会考虑使用实例属性,而不是类属性.

class L():
    foo = 100
L.foo
100
# 更新类属性
L.foo = L.foo +1
L.foo
101
# 创建类的实例
l = L()
l.foo = l.foo +1
l.foo
102
# 类的属性不变
L.foo
101
l2 = L
l2.foo
101

3.方法
  方法是类的定义中,定义的函数(方法也是类的属性).类的实例通过句点标识法来访问类方法.类方法是类的属性,不是在全局名字空间定义的函数,所以单独调用方法会引发NameError异常.类方法的调用:Python中要求没有创建实例,类方法几乎是不能被调用的,因此方法必须绑定(binging)到一个实例,但是没有绑定实例的情况下也可以,很少这样做,需要明确的给出实例对象,才能调用.

class MyClass():
    def fun(self):
        print('*******')
# 创建实例
mc = MyClass()
mc.fun()
*******
# 无绑定
MyClass.fun()
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)
<ipython-input-33-1875548ece2c> in <module>()
      1 # 无绑定
----> 2 MyClass.fun()
TypeError: fun() missing 1 required positional argument: 'self'

4.查看陌生类的属性
  查看一个类的属性,有3种方法,一是使用dir()内建函数,dir()返回的是一个类属性名列表.另外是通过访问类的字典属性_dict_,这是所有类的特殊属性之一.内建函数vars()返回的结果与dict相同是一个字典,访问类属性时,Python解释器将会搜索字典以得到需要的属性,如果在返回的字典中没有找到,会继续在父类的字典中进行搜索,采用'深度优先'的顺序.父类的搜索是反顺序的,从左至右.按照类定义时,父类参数的顺序.更改子类的属性,父类的字典不受影响.

class MyClass():
    'class definition'
    version = '1.1'
    def fun(self):
        print(MyClass.version)
# dir()查看类的属性
print(dir(MyClass))
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__',
 '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__',
  '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', 
  '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', 
  '__subclasshook__', '__weakref__', 'fun', 'version']
# __dict__
MyClass.__dict__
mappingproxy({'__dict__': <attribute '__dict__' of 'MyClass' objects>,
              '__doc__': 'class definition',
              '__module__': '__main__',
              '__weakref__': <attribute '__weakref__' of 'MyClass' objects>,
              'fun': <function __main__.MyClass.fun>,
              'version': '1.1'})
vars(MyClass)
mappingproxy({'__dict__': <attribute '__dict__' of 'MyClass' objects>,
              '__doc__': 'class definition',
              '__module__': '__main__',
              '__weakref__': <attribute '__weakref__' of 'MyClass' objects>,
              'fun': <function __main__.MyClass.fun>,
              'version': '1.1'})

4.1.类的特殊属性
对于任何类C,都有一下特殊属性.
C.__nmae_ :类C的名字(str)
C.__doc_  :类C的文档字符串
C.__hases_ :类C的父类构成的元组
C.__module_ :类C所在的模块
C.__class_ :类C对应的类
C.__dict_ :类C的属性字典

MyClass.__name__
'MyClass'
MyClass.__doc__
'class definition'
MyClass.__bases__
(object,)
# 类的全名是main.MyClass
MyClass.__module__
'__main__'
MyClass.__class__
type

类型对象是一个内建的类型,它也有_name_属性.type()返回被调用对象的类型

# __name__属性也适用于部分内建类型
stype = type('123')
stype.__name__
'str'

猜你喜欢

转载自blog.csdn.net/u014281392/article/details/79347738