3月17日课后总结

3/17课后总结

绑定方法

"""
	一般来说,在类里定义的属性和方法都是默认绑定给对象的
	绑定给对象的方法,就需要对象来调用
"""
class Dog:
    def __init__(self, name):
        self.name = name

    def say_hi(self):  # 绑定给对象的方法
        print('wangwang')

    @classmethod  # 内置装饰器,将该方法绑定给类,用类来调用
    def animal(cls):  # 绑定给类的方法
        return cls('mimi')

dog = Dog('dahuang')
dog.say_hi()
cat = dog.animal()
cat.say_hi()

"""
	绑定给对象的方法特殊之处就是:把对象名作为第一个参数,传给方法的第一个形参就是self
	绑定给类的方法特殊之处就是:把类名作为第一个参数传给方法的第一个形参就是cls
"""

非绑定方法

class Dog:
    def __init__(self, name):
        self.name = name

    @staticmethod  # 静态方法,不绑定类也不绑定对象
    def get_id():
        import uuid  # 只要长度固定,生成随机数,理论上肯定会重复
        return uuid.uuid4()
    
    def index(self):  # 如果对象和类都用到了,推荐绑定给对象self.__class__就是该对象的类了
        pass
    
print(dog.get_id())

隐藏属性(私有属性)

# 1.定义
"""
	隐藏属性或者隐藏方法就是也可称为私有属性私有方法
	在别的语言里定义私有属性一般都是private加属性名
	python中私有属性为:__name,私有方法为def __index():
	属性或者方法,隐藏后,对内不对外,在外部无法直接调用,在类里面可以
	或者使用_类名__属性(方法名)进行强制调用
	在python中没有绝对的私有或者隐藏的
"""
class people:
    __userid = 123456

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

laowang = people('laowang',21)
print(laowang.userid)  # 直接报错,找不到userid
print(laowang.__userid)  # 直接报错,找不到__userid
print(laowang._people__userid)  # 强制调用私有属性userid
# 一般情况下我们不会强制调用私有属性,如果想要查看或者修改私有属性或者方法一般都是在内部写一个接口,用来返回私有属性的值

    def get_userid(self):  # 用于查看userid
        return self.__userid

    def set_userid(self,value):  # 用于修改userid
        self.__userid = value
        return f'修改后的ID为{self.__userid}'

print(laowang.get_userid())
print(laowang.set_userid(111111))

property装饰器

"""
	主要用处是把方法伪装成属性使用,如同上面的get_userid和set_userid
	伪装后就可以直接用laowang.useid使用
"""
class people:
    __userid = 123456

    def __init__(self,name, age):
        self.name = name
        self.age = age
        
    @property  # 查看
	def useid(self): 
        return self.__userid
    
	@userid.setter  # 修改
    def useid(self,value):  
        self.__userid = value
        return f'修改后的ID为{self.__userid}'
    
    @userid.deleter  # 删除
    def userid(self):
        del self.__userid

laowang = people('laowang',123)
print(laowang.userid)
laowang.userid = 9999
del laowang.userid

# 关于property还有一种使用方法
class people:
    __userid = 123456

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


    def get_userid(self):
        return self.__userid


    def set_userid(self, value):
        self.__userid = value


    def del_userid(self):
        del self.__userid

    userid = property(get_userid,set_userid,del_userid)

laowang = people('laowang',123)
print(laowang.userid)
laowang.userid = 9999
del laowang.userid


class Me:
    def __init__(self,weight, height):
        self.weight = weight
        self.height = height

    @property
    def bmi(self):
        return self.weight / self.height ** 2

me = Me(65,1.8)
print(me.bmi)

面向对象的三大特征

# 继承
# 封装
# 多态
继承
"""
	一种新建类的方式,class Dog(animal):这种就可以说Dog是animal的子类或者派生类,animal是Dog的父类或者基类
	子类可以继承父类所有的属性和方法,父类可以通过特殊手段调用子类的属性或方法
	类是解决对象之间代码的冗余
	继承是解决类之间代码的冗余
	经典类:没有继承object类的子子孙孙类都是经典类
	新式类:继承了object类的子子孙孙类都是新式类
	只有再python2中才区分经典类和新式类,在python3中,全部都是新式类
"""
class Animal:  
    def __init__(self,name,age):
        self.name = name
        self.age = age


class Dog(Animal):  # 继承了Animal类
    def __init__(self,name,age):
        Animal.__init__(self,name,age)  

dog = Dog('dahuang',2)
print(dog.__dict__)  # 输出结果:{'name': 'dahuang', 'age': 2}

posted @ 2023-03-20 18:58  橘子熊何妨  阅读(23)  评论(0)    收藏  举报