Python-类

101 阅读3分钟

类对象和实例对象

  • 类对象提供默认行为,是实例对象的工厂.
  • 实例对象是程序处理的实际对象
  • 各自都有独立的命名空间,但是继承(可自动存取)创建该实例的类中的变量名.
  • 类对象来自于语句,而实例来自于调用
  • 每次调用一个类,就会得到这个类的新的实例.

类对象提供默认行为

  • class语句创建类对象并将其赋值给变量名.
  • class语句内的赋值语句会创建类的属性:就像模块文件一样,class语句内的顶层赋值语句(不是在def之内)会产生类对象的属性.执行class语句后,类的属性可有变量名点号运算符获取object.name.
  • 类对象提供对象的状态和行为.位于类中的函数def语句会生成方法,方法会处理实例

实例对象是具体的元素

  • 像函数那样调用类对象会创建新的实例对象
  • 每个实例对象继承类的属性并获得自己的命名空间呢
  • 在方法内对self属性做赋值运算会产生每个实例自己的属性
$ runme.py
class FirstClass:					#Define a class object
	def setdata(self,value):	    	#Define class methods
		self.data=value				#self id the instance
	def display(self):				
		print(self.data)			#self.data:per instance


from runme import *
x=FirstClass()
y=FirstClass()
x.setdata('King Arthur')
y.setdata(3.1415926)
x.display()
y.display()

#print()
#King Arthur
#3.1415926

#并且可以产生全新的属性:
>>> from runme import *
>>> x=FirstClass()
>>> x.anothername='spam'
>>> x.anothername
'spam'
>>> 


------------------
(program exited with code: 0)

请按任意键继续. . .



类继承

  • 超类列在类开头的括号中
  • 类从其超类中继承属性
  • 实例会继承所有可读类的属性:寻找变量名时,Python会检查实例,然后是它的类,最后是所有超类
  • 逻辑的修改是通过创建子类,而不是修改超类,在树中层次比较第的子类中重新定义超类的变量名,子类就会取代并制定所继承行为.
class SecondClass(FirstClass):					#inherits setdata
	def display(self):
		print('Current value="%s"'%self.data)	        #changes display

>>> from runme import *
>>> z=SecondClass()
>>> z.setdata(42)
>>> #find setdata in FirstClass
>>> z.display()		#finds overridden method in SecondClass
Current value="42"
>>> x.display() #x is still a FirstClass instance(old message)
King Arthur


类截获Python运算符

  • 运算符重载:加法,切片,打印和点号运算符等.
  • 以双下划线命名的方法(x)是特殊的狗子.Python运算符重载的实现是提供特定特殊方法来拦截运算.Python语言替每种运算和特殊命名之间,定义了固定不变的映射关系.
  • 当实例出现在内置运算时,这类方法会自动调用:例如:如果实例对象继承了__add__方法,当对象出现+表达式内时该方法就会调用.该方法的返回值会变成相应表达式的结果.
  • 类可覆盖多数内置类型运算.有几十种特殊运算符重载方法的名称,几乎可以截获并实现内置类型的所有运算,它不仅包括表达式,而且像打印和对象建立这类运算符也包括在内.
  • 运算符覆盖的方法没有默认值,而且也不需要.
  • 运算符可让类与Python的对象模型相集成
  • __init__方法,称为构造函数方法,
>>> from runme import *

>>> a=ThirdClass('abc')

>>> a.display()
Current value="abc"
>>> print(a)
[ThirdClass:abc]
>>> 
>>> b=a+'xyz'
>>> b.display()
Current value="abcxyz"
>>> print(b)
[ThirdClass:abcxyz]
>>> a.mul(3)
>>> print(a)
[ThirdClass:abcabcabc]
>>>