点击(此处)折叠或打开
-
#!/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