类是抽象的模板,而实例是根据类创建出来的一个个具体的“对象”。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())
输出:
我会打印
将实例用作类的属性,可以将大类拆分为多个小类,避免程序杂乱。