类是抽象的模板,而实例是根据类创建出来的一个个具体的“对象”。class后面紧接着是类名,类名通常是大写开头的单词。

创建和使用类

使用关键字class定义类:

class Dog():
    pass 

这样就创建了Dog类。

>>> d = Dog()
>>> d.name = 'jingjing'
>>> d.name
'jingjing'

我们可以像上面的例子那样,给实例变量绑定属性。

类中的方法

和普通的函数相比,在类中定义的函数只有一点不同,就是第一个参数永远是实例变量self,并且,调用时,不用传递该参数。

class Dog():
    def say_hi(self):
        print('hello')
>>> p = Dog()
>>> p.say_hi()
hello

__init__方法

类具有模板的作用,init()是一个特殊的方法,类的实例化操作会自动调用它。

class Dog():
	
	def __init__(self,a,b):
		self.name = a
		self.age = b

方法__init__()的第一个参数永远时self,它表示创建的实例本身,因此,在__init__()方法中,我们可以把各种属性绑定到self,因为self就指向实例本身。

创建实例

有了__init__()方法,创建实例的时候就要传入和__init__(),相匹配的参数,但self不需要传入,因为它表示实例本身,Python会自动传入。

class Dog():
	
	def __init__(self,a,b):
		self.name = a
		self.age = b
a = Dog('joecy','wang')

实例属性和类属性

class Dog():
	name = 'joecy'   #类属性
	
a = Dog()
print(a.name)

输出:

joecy
a.name = wang  #给实例属性赋值
print(a.name)

输出:

wang

可见,在编写程序的时候,千万不要对实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性。

类的继承

class A():
	def p(self):
		print('我会打印')

class B(A):
	def s(self):
		print('我会唱歌')
x = B()
print(x.p())

这样类B就完全继承了类A的所有属性和方法。

重写父类方法

class A():
	def p(self):
		print('我会打印')

class B(A):
	def s(self):
		print('我会唱歌')
	def p(self):
		print('我重写了方法')
x = B()
print(x.p())

输出:

我重写了方法

当子类和父类都存在相同的方法p()时,子类的p()覆盖了父类的p(),在代码运行的时候,总是会调用子类的p()。这样就完成了父类方法的重写。

将实例用作属性

class A():
	def p(self):
		print('我会打印')

class B():
	def __init__(self):
		self.work = A()
x = B()
print(x.work.p())

输出:

我会打印

将实例用作类的属性,可以将大类拆分为多个小类,避免程序杂乱。