#面向对象基础知识
#- `__init__()`方法,在创建一个对象时默认被调用,不需要手动调用
#- `__init__(self)`中的self参数,不需要开发者传递,python解释器会自动把当前的对象引用传递过去。
'''魔法方法
`__init__()`: 初始化
`__str__()`:输出对象信息
`__del__()`:删除对象时调用
'''
class Washer():
def __init__(self, width, height):
self.width = width
self.height = height
def print_info(self):
print(f'洗衣机的宽度是{self.width}')
print(f'洗衣机的高度是{self.height}')
def __str__(self):
return '这是海尔洗衣机的说明书'
def __del__(self):
print(f'{self}对象已经被删除')
haier1 = Washer(10, 20)
haier1.print_info()
print(haier1)
del haier1
#多继承与调用父类属性方法,私有属性设置外面访问接口
class Master():
def __init__(self):
self.kongfu = '[master属性]'
class School():
def __init__(self):
self.kongfu = '[school属性]'
def makecookies(self):
print("学校的方法")
class Prentice(School, Master):
def __init__(self):
self.kongfu = '[自己方法]'
self.__money=10000
# 调用父类方法,但是为保证调用到的也是父类的属性,必须在调用方法前调用父类的初始化
def schoolff(self):
#super().method()格式合适用单继承
#super(A,self).method()使用多继承
#继承顺序为“class Prentice(School, Master)”,写左边的调用右边,如写Prentice则调用school
super(Prentice,self).makecookies()
def mastersx(self):
super(School,self).__init__()#调用时init传递除self外参数
print(self.kongfu)
# 获取私有属性
def get_money(self):
print(self.__money)
# 修改私有属性
def set_money(self,m):
self.__money = m
daqiu = Prentice()
#自己的方法
print(daqiu.kongfu)
#师傅的属性
daqiu.mastersx()
#学校的方法
daqiu.schoolff()
#获取私有属性
daqiu.get_money()
# 修改私有属性
daqiu.set_money(500)
daqiu.get_money()
# 注意:当一个类有多个父类的时候,默认使用第一个父类的同名属性和方法。
### 类属性
'''类属性的优点
>
> - **记录的某项数据 始终保持一致时**,则定义类属性。
> - **实例属性 要求每个对象为其单独开辟一份内存空间来记录数据,而类属性为全类所共有,仅占用一份内存
'''
#类属性只能通过类对象修改,不能通过实例对象修改,如果通过实例对象修改类属性,表示的是创建了一个实例属性。
class Dog(object):
tooth = 10
def __init__(self):
self.age=20
# 修改类属性
Dog.tooth = 15
Dog.age=30 #init初始化的赋值不能修改
wangcai = Dog()
xiaohei = Dog()
print(Dog.tooth) # 15
print(wangcai.tooth) # 15
print(xiaohei.tooth) # 15
print(wangcai.age) # 20
print(xiaohei.age) # 20
# 不能通过对象修改属性,如果这样操作,实则是创建了一个实例属性
wangcai.tooth = 20
print(wangcai.tooth) # 20
print(Dog.tooth) # 10
### 类方法
'''
需要用装饰器`@classmethod`来标识其为类方法,对于类方法,
第一个参数必须是类对象,一般以`cls`作为第一个参数。
'''
#类方法使用场景
'''
- 当方法中需要使用类对象(如访问私有类属性等)时,定义类方法
- 类方法一般和类属性配合使用
类和实例都可以访问类方法
'''
class Dog(object):
__tooth = 10
@classmethod
def get_tooth(cls):
return cls.__tooth
wangcai = Dog()
result = wangcai.get_tooth()
print(result) # 10
## 静态方法使用场景
'''
当方法中既不需要使用实例对象(如实例对象,实例属性),也不需要使用类对象(如类属性、类方法、创建实例等)时,定义静态方法
取消不需要的参数传递,有利于减少不必要的内存占用和性能消耗
'''
class Dog(object):
@staticmethod
def info_print():
print('这是一个狗类,用于创建狗实例....')
# 静态方法既可以使用对象访问又可以使用类访问