一、面向对象三大特性:
1、封装:
将属性和⽅法书写到类的⾥⾯的操作即为封装
封装可以为属性和⽅法添加私有权限
2、继承:
⼦类默认继承⽗类的所有属性和⽅法
⼦类可以重写⽗类属性和⽅法
3、多态:
⼀种使⽤对象的⽅式,⼦类重写⽗类⽅法,调⽤不同⼦类对象的相同⽗类⽅法,可以产⽣不同的执⾏结果
实现步骤:
1)定义⽗类,并提供公共⽅法
2)定义⼦类,并重写⽗类⽅法
3)传递⼦类对象给调⽤者,可以看到不同⼦类执⾏效果不同
例如:
class Animal():
def work(self):
print("Animal ~~~")
class Dog(Animal):
def work(self):
print("Dog 吃骨头~~")
class Cat(Animal):
def work(self):
print("Cat 吃<。)#)))≦")
class Person():
def work_with_animal(self,obj):
obj.work()
person = Person()
dog = Dog()
cat = Cat()
person.work_with_animal(dog)
person.work_with_animal(cat)
输出:
Dog 吃骨头~~
Cat 吃<。)#)))≦
二、类属性和实例属性
类属性就是 类对象 所拥有的属性,它被 该类的所有实例对象 所共有。
类属性可以使⽤ 类对象 或 实例对象 访问。
类属性只能通过类对象修改,不能通过实例对象修改,如果通过实例对象修改类属性,表示的是创建了⼀个实例属性。
class Animal():
def work(self):
print("Animal ~~~")
class Dog(Animal):
def work(self):
print("Dog 吃骨头~~")
class Cat(Animal):
def work(self):
print("Cat 吃<。)#)))≦")
class Person():
name = '小花'
def work_with_animal(self,obj):
obj.work()
person1 = Person()
person2 = Person()
print(person1.name)#小花
print(person2.name)#小花
#修改类属性
Person.name = '大黄'
print(person1.name)#大黄
print(person2.name)#大黄
# 不能通过对象修改属性,如果这样操作,实则是创建了⼀个实例属性
person1.name = '小明'
person2.name = '小红'
print(person1.name)#小明
print(person2.name)#小红
class Person():
name = '小花'
def __init__(self):
self.age = 10
def print_age(self):
print(f"{self.age}")
person1 = Person()
print(person1.age)#10
person1.print_age()#10
三、类⽅法和静态⽅法
1、类方法
1)类方法需要⽤装饰器 @classmethod 来标识其为类⽅法,对于类⽅法,第⼀个参数必须是类对象,⼀般以cls 作为第⼀个参数。
2)当⽅法中 需要使⽤类对象 (如访问私有类属性等)时,定义类⽅法。
3)类⽅法⼀般和类属性配合使⽤。
下述示例通过类方法对类属性进⾏修改:
class Person():
tel = '15000001111'
@classmethod
def get_tel(cls):
return cls.tel
@classmethod
def set_tel(cls,tel):
cls.tel = tel
person = Person()
person.set_tel('15899994444') #修改类属性
print(person.get_tel()) #获取类属性 15899994444
2、静态方法
1)需要通过装饰器 @staticmethod 来进⾏修饰,静态⽅法既不需要传递类对象也不需要传递实例对象(形参没有self/cls)。
2)静态⽅法 也能够通过 实例对象 和 类对象 去访问。
3)当⽅法中 既不需要使⽤实例对象(如实例对象,实例属性),也不需要使⽤类对象 (如类属性、类⽅法、创建实例等)时,定义静态⽅法。
class Person():
tel = '15000001111'
@staticmethod
def print_tel():
print(f"{Person.tel}")
person = Person()
# 静态⽅法既可以使⽤对象访问⼜可以使⽤类访问
person.print_tel() #15000001111
Person.print_tel() #15000001111
网友评论