点击(此处)折叠或打开
- #!/usr/bin/env python
- #-*-coding:utf8-*-
- '''
- 类代码编写基础
- 类有三个主要不同
- 类产生多个实例对象
- 命名空间继承
- 运算符重载
- 类产生多个实例对象
- 类对象与实例对象
- 类对象提供默认行为,是实例工厂
- 实例对象是程序处理的实际对象,各自有独立的命名空间,便实例对象继承创建该实例的类的变量名。
- 类对象来自语句,实例对象来自调用。每调用一次类,产生一个新实例。执行class语句,就产生一个类对象。
- 类对象提供默认行为
- python类的主要特点:
- class语句创建类对象并将基赋值给变量名。
- class内的赋值语句会创建类的属性。
- 类属性提供类的状态与行为。 类属性可由类创建的实例共享,类中的函数是方法,方法处理实例。
- 实例对象是具体的元素
- 实例对象是调用产生的。
- 调用类会产生新的实例对象,实例是类的具体元素。
- 实例对象继承类的属性并创建自己的作用域(命名空间)
- 方法内对self属性赋值会产生每个实例自己的属性。对self的属性赋值会创建或修改实例内的数据,而不是类的数据。
- 类通过继承进行定制
- 除了生成实例外,类也可以生成子类进行修改。
- 类可以继承其它类,这是类层次结构。在阶层比较低的类中可以覆盖继承的属性,从而实现定制。
- 类是层次结构,模块是平面结构。
- 实例从类继承,类从超类继承。
- 继承机制的核心:
- 超类列在类开关的括号中。
- 类从其超类中继承属性。
- 实例继承所有可读类的属性。
- 每个object.attribute都会独立开启新的搜索。
- 逻辑的修改是通过创建了类,而不是修改超类。
- 类是模块内的属性
- python中的惯例,类应该使用一个大写字母开头,尽量不与模块名一致
- 模块反应了整个文件,而类是模块中的语句。
-
- 类可以截获python运算符
- 运算符重载:就是让类写成的对象可截获并响应内置类型上的运算:加法,切片,打印,点运算等。
- 以双下划线命名的方法(__XX__)是特殊的钩子。
- 当实例出现内置运算时,这类方法会自动调用。
- 类可以覆盖多数内置类型运算。
- 运算符覆盖方法没有默认值,也不需要。(如果类没有定义或继承运算符重载方法,就是说相应的运算在类实例中并不支持。如果没有__add__,+表达式就会引发异常)
- 运算符可让类与python的对象模型相集成。
- __init__是构造函数方法。
- 为什么要使用运算符重载
- 如果省略运算符重载,并且不从超类中继承,实例就不支持相应的运算;
- 只有在实现本质为数学对象时,才会用到许多运算符重载
- 传递用户自定义对象给预期的内置类型(如字典,列表)可用的运算符的函数。
- 类与字典的关系
- 类像字典一样存储数据,使用方法处理逻辑
- '''
- #创建类
- class FirstClass: #定义FirstClass类对象
- def setdate(self,value): #定义类方法setdata 类内的赋值会成成为类的属性:FirstClass.setdata,方法每一个参数自动接收隐含的实例对象:调用的主体
- self.data=value #self是实例,设定实例属性data
- def display(self): #定义类方法dispaly FirstClass.display
- print(self.data) #方法内容是打印实例属性data
- X=FirstClass() #产生2个实例X,Y
- Y=FirstClass()
- '''
- FirstClass
- (-setdata,-display)
- X(-data) Y(-data)
-
- '''
- #继承是属性点号运算时发生的,而且只查找连接类的变量名。
- X.setdate('talen')
- Y.setdate(3.1415926)
- X.display()
- Y.display()
- X.data='new'
- X.display()
- #除在类中定义外,还可以直接对实例添加属性
- X.newvalue='create'
- print(X.newvalue)
-
- class secondclass(FirstClass):
- def display(self): #secondclass的属性display覆盖超类的属性。这种动态称为重载。
- print('current value = ' "%s" % self.data)#secondclass继承了FirstClass的setdata,所以这里的data实例属性还是可以用的。
- Z=secondclass()
- Z.setdate('new data')
- Z.display()
- '''
- Z(-data) secondclass(-display) FirstClass(-setdata,-display)
- Z.data Z.display Z.setdata
- '''
-
- class ThirdClass(secondclass): #超类secondclass继承
- def __init__(self,value): #必须在类上附加value参数
- self.data=value
- def __add__(self,other): #这是一种运算符重载
- return ThirdClass(self.data + other)
- def __str__(self):
- return '[ThirdClass: %s ]' % self.data
- def mul(self,other):
- self.data *= other
- A=ThirdClass('server') #__init__调用。必须在后面附加参数,否则报TypeError: __init__() takes exactly 2 arguments (1 given)
- A.display() #继承了secondclass超类中的display方法。
- print(A) #__str__调用
- B=A+'ok' #__add__调用,产生新的实例。B拥有ThirdClass所有属性
- B.display()
- print (B)
- A.mul(3)
- print(A)
- B.mul(4)
- print(B)
- #世界上最简单的类
- class rec:
- pass
- rec.name='bob'
- rec.age=40
- print(rec.name)
- C=rec()
- D=rec()
- print(C.name)
- print(D.name)
- C.name='talen'
- print(C.name)
- print(D.name)
- #实例,类中所有赋值查看
- print(rec.__dict__.keys())
- print(C.__dict__.keys())
- print(D.__dict__.keys())
- #查看每个实例连接的类
- print(C.__class__)
- #查看超类
- print(ThirdClass.__bases__)
结果
点击(此处)折叠或打开
- /usr/bin/python2.7 /home/talen/PycharmProjects/untitled/t26.py
- talen
- 3.1415926
- new
- create
- current value = new data
- current value = server
- [ThirdClass: server ]
- current value = serverok
- [ThirdClass: serverok ]
- [ThirdClass: serverserverserver ]
- [ThirdClass: serverokserverokserverokserverok ]
- bob
- bob
- bob
- talen
- bob
- ['age', '__module__', '__doc__', 'name']
- ['name']
- []
- __main__.rec
- (class __main__.secondclass at 0x7ff6f5243600>,)
-
- Process finished with exit code 0