caicaix

导航

面向对象(绑定方法、非绑定方法、隐藏属性、property装饰器)

绑定方法

1.绑定给对象的方法

就是在生成对象的时候,可以通过对象直接使用除了__init__的方法

只需要在定义阶段给方法(函数)里面传一个self,self也就是对象自己

如果需要直接类来调用,则还需要传入  "对象名"

class Games:
    is_type = 'hero'

    def __init__(self, name, hp):
        self.name = name
        self.hp = hp

    def check_hp(self):  # 这个self相当于在调用阶段的Games.check_hp(hero1)
        print(f'{self.name}的血量为{self.hp}')


hero1 = Games('瑶瑶公主', 2587)
hero1.check_hp()     # 直接调用
# 瑶瑶公主的血量为2587

 

2.绑定给类的方法

当产生一个对象之后,可以直接调用类.方法()来使用,而不再通过 对象.方法来调用

如果方法有需要传参数,那么只能通过类来调用,不再能通过对象

class Games:
    is_type = 'hero'

    def __init__(self, name, hp):
        self.name = name
        self.hp = hp
        with open(r'a.txt', 'w', encoding='utf8') as f:
            f.write(name+'|'+hp)

    @classmethod
    def check_hp(cls):  # 这个cls就是类本身
        with open(r'a.txt', 'r', encoding='utf8') as f:
            res = f.read().split('|')
        return res


hero1 = Games('111', '2587')
print(Games.check_hp()[0], Games.check_hp()[1])   # 直接调用

 

非绑定方法

就是既不绑定给类,也不绑定给对象的方法,就是我的可以使用类的方法调用,也可以产生的对象中使用

小tips:当方法里即用到了类,也用到了对象,这个方法绑定对象更合适

class Games:
    is_type = 'hero'

    def __init__(self, name, hp):
        self.name = name
        self.hp = hp
        self.new = self.check_hp(5)

    @staticmethod    # 只需要添加一个语法糖
    def check_hp(n):
        return n


hero1 = Games('111', '2587')
print(hero1.new)
print(Games.check_hp(5))

 

隐藏属性

1.隐藏属性在类的定义阶段,发生了变形,__类名__属性名

2.不但可以隐藏类属性、方法、对象的属性都可以隐藏的,而对类的内部是开放的

3.隐藏属性对外不对内,对内的外部都是隐藏的,而对类的内部是开放的

使用情况:

  当我们不想让外部直接修改或者查看类中的属性时,可以通过隐藏属性+方法来对传入的修改值进行"操作"

class Games:
    __is_type = 'hero'  # is_type已经被隐藏在外部找不到

    def __init__(self, name, hp):  # 形参
        self.name = name    # 前面的name是所产生字典中的key值
        self.hp = hp

    def xiugai(self, new_type):
        self.__is_type = new_type

    def check_type(self):
        return self.__is_type


hero1 = Games('瑶瑶公主', 2587)
hero2 = Games('飞飞公主', 3440)

hero1.xiugai('辅助')
print(hero1.check_type())

 

property装饰器

就是将方法伪装成属性来使用

方法一(装饰器):

class Games:
    __is_type = 'hero'  # is_type已经被隐藏在外部找不到

    def __init__(self, name, hp):
        self.name = name
        self.hp = hp

    @property      # 将property绑定给is_type
    def is_type(self):
        return self.__is_type

    @is_type.setter   # 用于修改,只要有等于就会自动找到
    def is_type(self, new_type):
        Games.__is_type = new_type

    @is_type.deleter  # 同理,用于删除
    def is_type(self):
        del Games.__is_type


hero2 = Games('飞飞公主', 3440)
print(hero2.is_type)   # hero
hero2.is_type = '辅助'
print(hero2.is_type)   # 辅助
del hero2.is_type
print(hero2.is_type)   # 报错

 

方法二(表达式):

class Games:
    __is_type = 'hero'  # is_type已经被隐藏在外部找不到

    def __init__(self, name, hp):
        self.name = name
        self.hp = hp

    def get_type(self):
        return self.__is_type

    def set_type(self, new_type):
        Games.__is_type = new_type

    def del_type(self):
        del Games.__is_type

    is_type = property(get_type, set_type, del_type)
    # 顺序只能查看、修改、和删除,顺序不可以变


hero2 = Games('飞飞公主', 3440)
print(hero2.is_type)  # hero
hero2.is_type = '辅助'
print(hero2.is_type)  # 辅助
del hero2.is_type
print(hero2.is_type)  # 报错

posted on 2023-06-28 16:02  菜CAIx  阅读(9)  评论(0编辑  收藏  举报