1.类与实例:
类与实例就像一般与特殊的区别:
如动物可以是一个类,而狗可以是这个类的一个实例, 人可以是一个类,而学生可以是这个类的一个实例
2.创建类与实例:
类的创建 :
class 类名(父类或基类,一般默认为object) :
属性
方法
实例的创建:
实例名 = 类名()
实例可以使用类的属性与方法
class Animal(object):
def eat(self, food):
print(f'eating {food}!')
def play(self, toy):#self为实例对象
print(f'playing {toy}!')
def sleep(self):
self.eat('rice')#self用于类的函数之间的调用
print('sleeping!')
dog = Animal()#当实例对象调用的时候self为实例对象本身
dog.play('books')#self默认为实例对象,可不用传递
#也可以使用Animal.play(dog, 'books')
dog.sleep()
结果:
3.类的__init__方法:
当类创建一个实例的时候会自动调用init方法
class Animal(object):
def __init__(self, name, age):
self.name = name
self.old = age
print('animal!')
def play(self, toy):
print(f'{self.name} is {self.old} and playing {toy}!')
dog = Animal('Teddy', 5)#在实例化对象的时候就调用了init方法
dog.play('toy')
结果:
4.实例属性与类属性
实例属性:self就是实例,而self.name以及self.old等这些就是实例属性,在类中使用实例属性可以使用self.__的形式
class Animal(object):
def __init__(self, name, age):
self.name = name
self.old = age
print('animal!')
def play(self, toy):#self为实例对象
print(f'{self.name} is {self.old} and playing {toy}!')
dog = Animal('Teddy', 5)#在实例化对象的时候就调用了init方法
dog.gender = 'male'#在类外面动态定义的实例属性
print(dog.gender)
pig = Animal('andy', 5)#在实例化对象的时候就调用了init方法
print(pig.gender)
输出:
pig没有gender属性
类属性:
类的属性就像是所有实例所共有的属性,如果实例没有这个属性,就会使用类属性,有则使用实例的属性
class Animal(object):
age = 5
def eat(self,food):
print(f"正在{food}")
def play(self):
print("正在玩耍")
def sleep(self):
print("正在睡觉")
Animal.age = 8
dog = Animal()
# dog.eat("狗粮")
# dog.play()
# dog.sleep()
dog.age = 10#有自己的实例属性
print(f'dog的age是{dog.age}')
pig = Animal()#没有自己的age属性会随类的变化而变化
print(f'pig的age是{pig.age}')
print(f'Animal的age是{Animal.age}')
输出:
5.类的继承:
在class 类名(父类)
父类为该类继承的类,该类可以使用使用父类的方法与属性
class Animal(object):
age = 11
def __init__(self, name):
self.name = name
def eat(self, food):
print(f'eating {food}!')
def play(self, toy):#self为实例对象
print(f'{self.name} is playing {toy}!')
def sleep(self):
self.eat('rice')
print('sleeping!')
class Dog(Animal):#能继承父类的属性和方法
def bark(self):
print(f'{self.name} is barking!')
dog = Dog('Teddy')
dog.play('tp')
dog.bark()
#子类同样会继承父类的实例属性
输出:
6.方法的重写:
子类可以在类中重写父类的方法,名字一样,会覆盖掉父类的方法:
class Animal(object):
age = 11
def __init__(self, name):
self.name = name
def eat(self):
print(f'eating food!')
def play(self, toy):#self为实例对象
print(f'{self.name} is playing {toy}!')
def sleep(self):
self.eat('rice')
print('sleeping!')
class Dog(Animal):#能继承父类的属性和方法
def bark(self):
print(f'{self.name} is barking!')
def eat(self):
print(f'{self.name} is eating dogfood')
dog = Dog('Teddy')
dog.eat()
#子类会优先调用自身的方法,自身的方法不存在才会调用父类的方法
#这种方法称为方法的重写
同样在子类中重写Init方法也会覆盖掉父类的init方法,如果不想覆盖掉,可以使用super方法来访问父类的init方法
class Animal(object):
age = 11
def __init__(self, name):
self.name = name
def eat(self, food):
print(f'eating {food}!')
def play(self, toy):#self为实例对象
print(f'{self.name} is playing {toy}!')
def sleep(self):
self.eat('rice')
print('sleeping!')
class Dog(Animal):#能继承父类的属性和方法
def __init__(self, name, gender):
super().__init__(name)#子类的init会覆盖掉父类的init,要保留要使用super调用父类的init方法
def bark(self):
print(f'{self.name} is barking!')
dog = Dog('Teddy', 'male')
dog.bark()