面向对象三大特征
类属性和实例属性
类方法和静态方法
一、面向对象三大特征
封装
将属性和方法写到类里面的操作就是封装
封装可以为属性和方法添加私有权限
继承
子类默认继承父类的所有属性和方法
子类可以重写父类的属性和方法
多态
传入不同的对象,产生不同的结果
多态
多态是一种使用对象的方式,子类重写父类的方法,调用不同的子类对象,相同的父类方法,可以产生出不同的结果。传入不同的对象,产生不同的结果,最好依赖继承
实现步骤:
定义父类,并提供公共方法
定义子类,并重写父类方法
传递子类对象给调用者,可以看到不同的子类执行效果不同
举例
class Dog(object):
def work(self):
print('我是父类的狗狗')
class SmallDog(Dog):
def work(self):
print('小狗在工作')
class BigDog(Dog):
def work(self):
print('大狗在工作')
class Person(object):
def with_dog(self, dog):
dog.work()
sd = SmallDog()
bd = BigDog()
p = Person()
p.with_dog(sd)
p.with_dog(bd)
# 输出
# 小狗在工作
# 大狗在工作
二、类属性和实例属性
2.1类属性就是类对象所拥有的属性,它被该类的所有实例对象所共有
类属性可以使用 类对象或实例对象访问
用法:
类.属性名 (类属性)
对象.属性名 (实例属性)
class Dog(object):
tooth = 10
dahuang = Dog()
xiaohei = Dog()
print(Dog.tooth)
print(dahuang.tooth)
print(xiaohei.tooth)
类属性的优点:
记录的某项数据,始终保持一致时,则定义类属性
实例属性要求,每个对象为其单独开辟一块内存空间来记录数据,而类属性,为全类所共有,仅占用一份内存,更节省内存空间
2.2修改类属性
修改类属性只能通过类对象修改,不能通过实例对象,如果通过实例对象修改类属性,表示的是创建了一个同名的实例属性
class Dog(object):
tooth = 10
Dog.tooth = 222
print(Dog.tooth)
dahuagn = Dog()
xiaohei = Dog()
dahuagn.tooth = 3333
print(Dog.tooth)
print(dahuagn.tooth)
# 输出
# 222
# 222
# 3333
三、类方法
特点:
用装饰器@classmethod来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数
使用场景:
当方法中需要使用类对象(如访问私有类属性)时,定义类方法
类方法一般和类属性配合使用
class Dog(object):
__tooth = 100
@classmethod
def print_tooth(cls):
return cls.__tooth
dahuang = Dog()
res = dahuang.print_tooth()
print(res)
四、静态方法
特点:
通过装饰器@staticmethod来进行修饰,静态方法既不需要传递类对象也不需要传递实例对象(形参没有self/cls)
静态方法,可以通过实例对象和类对象去访问
使用场景:
当方法中,既不需要使用实例对象,也不需要使用类对象,定义静态方法
取消不需要的参数传递,有利于减少内存消耗和性能消耗
class Dog(object):
@staticmethod
def get_tooth():
print('这是一个静态方法')
dahuang = Dog()
dahuang.get_tooth()
Dog.get_tooth()
# 输出
# 这是一个静态方法
# 这是一个静态方法
五、总结:
面向对象三大特性:
封装
继承
多态
类属性
归属于类对象的属性,所有对象共有的属性
创建、修改
实例属性
类方法
@classmethod
def xxx(cls):
代码
静态方法
@staticmethod
def xx():
代码