类完全入门

#面向对象基础知识

#- `__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('这是一个狗类,用于创建狗实例....')

# 静态方法既可以使用对象访问又可以使用类访问

  

posted @ 2021-01-05 15:16  遥月  阅读(58)  评论(0)    收藏  举报