一、构造方法
class Dog:
#构造方法 - 添加实例属性,做其他初始化工作
def __init__(self,name,height,power):
self.name = name
self.height = height
self.power = power
self.blood = 10
print(f"{self.name}出生了!汪汪!")
d1 = Dog('大黄',0.7,3) #创建第一个实例
d2 = Dog('二黑',0.5,4) #创建第二个实例
print(d1.name,d1.height,d1.power,d1.blood) #输出:大黄 0.7 3 10
print(d2.name,d2.height,d2.power,d2.blood) #输出:二黑 0.5 4 10
二、实例方法
第一个参数必须是self
class Dog:
#构造方法 - 添加实例属性,做其他初始化工作
def __init__(self,name,height,power):
self.name = name
self.height = height
self.power = power
self.blood = 10
print(f"{self.name}出生了!汪汪!")
#实例方法,第一个参数必须是self
def bark(self):
print(f'我是{self.name},身高{self.height},血量{self.blood},攻击力{self.power}')
d1 = Dog('大黄',0.7,3) #创建第一个实例
d2 = Dog('二黑',0.5,4) #创建第二个实例
d1.bark()
d2.bark()
输出
大黄出生了!汪汪!
二黑出生了!汪汪!
我是大黄,身高0.7,血量10,攻击力3
我是二黑,身高0.5,血量10,攻击力4
三、类属性
1.整个类只有1份,所有的实例都共享这一份
2.可以通过类名或者实例名访问类属性,访问的都是同一个
3.修改类属性需要通过类名
4.因为通过实例名就会创建一个同名的实例变量
5.实例变量和类变量同名时,使用实例访问优先使用的是实例变量
class Dog:
num_of_dogs = 0 #类属性
#实例方法,第一个参数必须是self
#构造方法 - 添加实例属性,做其他初始化工作
def __init__(self,name,height,power):
self.name = name
self.height = height
self.power = power
self.blood = 10
print(f"{self.name}出生了!汪汪!")
d1 = Dog('大黄',0.7,3) #创建第一个实例
d2 = Dog('二黑',0.5,4) #创建第二个实例
#通过类名访问
print(Dog.num_of_dogs) #输出:0
#通过实例访问
print(d1.num_of_dogs) #输出:0
print(d2.num_of_dogs) #输出:0
Dog.num_of_dogs = 8
print(Dog.num_of_dogs) #输出:8
print(d1.num_of_dogs) #输出:8
print(d2.num_of_dogs) #输出:8
d1.num_of_dogs = 10 #给d1创建了一个实例属性,当实例属性和类属性相同时,通过实例访问,优先访问的是实例属性
print(Dog.num_of_dogs) #输出:8
print(d1.num_of_dogs) #输出:10
print(d2.num_of_dogs) #输出:8
四、类方法
可以通过类名调用,也可以通过实例名调用
1.类方法不能访问实例变量,可以访问类变量
2.类方法需要加上@classmethod,第一个参数必须是cls
class Dog:
dogs = [] #用来保存所有狗的列表
@classmethod
def num_of_dogs(cls):
"""
得到狗的总数
"""
return len(cls.dogs)
@classmethod
def biggest(cls):
"""
得到所有狗中高度的最大值
"""
max_height = -1
for d in cls.dogs:
if(d.height > max_height):
max_height = d.height
return max_height
#实例方法,第一个参数必须是self
#构造方法 - 添加实例属性,做其他初始化工作
def __init__(self,name,height,power):
self.name = name
self.height = height
self.power = power
self.blood = 10
Dog.dogs.append(self) #将创建的狗添加到dogs列表中
print(f"{self.name}出生了!汪汪!")
d1 = Dog('大黄',0.7,3) #创建第一个实例
d2 = Dog('二黑',0.5,4) #创建第二个实例
print(Dog.num_of_dogs()) #输出:2
print(d1.num_of_dogs()) #输出:2
print(d2.num_of_dogs()) #输出:2
print(Dog.biggest()) #输出:0.7
print(d1.biggest()) #输出:0.7
print(d2.biggest()) #输出:0.7
五、静态方法
1.需要使用@staticmethod
2.不需要传入实例(self)或者类(cls)作为第一个参数
应用:当不需要传入实例和类时,采用静态方法
class Dog:
@staticmethod
def intro():
print("Dog is human's best friend")
dog = Dog()
#使用类名访问静态方法
Dog.intro()
#使用实例名访问静态方法
dog.intro()
输出
Dog is human’s best friend
Dog is human’s best friend
六、继承
class Dog:
def __init__(self,name,height,power):
self.name = name
self.height = height
self.power = power
self.blood = 10
def bark(self):
print(f'我是{self.name},身高{self.height}')
#继承父类Dog
class SheepDog(Dog):
def __init__(self,name,height,power,num_of_sheep):
super().__init__(name,height,power)
self.num_of_sheep = num_of_sheep
def protect(self):
print('我开始保护小羊了')
sd = SheepDog('牧羊犬1',0.6,4,5)
print(sd.name)
print(sd.blood)
sd.bark()
sd.protect()
输出
牧羊犬1
10
我是牧羊犬1,身高0.6
我开始保护小羊了
class Dog:
def __init__(self,name,height):
self.name = name
self.height = height
def bark(self):
print(f'我是{self.name},身高{self.height}')
class SheepDog(Dog):
def __init__(self,name,height,num_of_sheep):
super().__init__(name,height)
self.num_of_sheep = num_of_sheep
def bark(self):
print("我是牧羊犬,我骄傲!")
super().bark() #继承父类的方法
sd = SheepDog('牧羊犬1',0.6,5)
sd.bark()
#输出
"""
我是牧羊犬,我骄傲!
#我是牧羊犬1,身高0.6
"""
七、创建类
1.创建类时,传的参数可以是其他类
dog.py代码中的如下
class Dog:
def __init__(self,name,height,power):
self.name = name
self.height = height
self.power = power
self.blood = 10
def bark(self):
print(f'我是{self.name},身高{self.height}')
#宠物犬
class PetDog(Dog):
def __init__(self,name,height,power,price,house):
super().__init__(name,height,power)
self.price = price
self.house = house
def sing(self):
print('我开始唱歌咯')
#狗窝类
class DogHouse():
def __init__(self,no):
self.no = no
print(f'已创建狗窝{self.no}')
game.py的代码如下
import dog
house = dog.DogHouse('9527')
pd = dog.PetDog('小可爱',0.2,1,988,house)
print(pd.price)
pd.bark()
在命令行输入python game.py
E:\python\OOP>python game.py
已创建狗窝9527
988
我是小可爱,身高0.2