【python-08】

python第8天

'''
类:一群具有相同特征和行为的统称,如:中国人
	定义:class
	属性:用于描述事物的特征,实质为变量
	方法:用来描述事物的行为,实质为函数,定义:def
	
对象:类中具体的一个实例对象,如:张三

变量:存储数据
函数:存储代码
类:  存储"相关性"变量和函数

'''

class Person(object):
    color = "yellow" # 公共属性

    def __init__(self,name,age): #构造函数,实例私有属性
        self.name = name
        self.age = age

    def play(self):
        print(f"{self.name}正在吃晚饭!")

ad = Person("张三",19)
adn = Person("李四",45)

ad.name
#|> '张三'
ad.age
#|> 19
ad.play()
#|> 张三正在吃晚饭!
ad.color
#|> 'yellow'
adn.name
#|> '李四'
adn.age
#|> 45
adn.play()
#|> 李四正在吃晚饭!
adn.color
#|> 'yellow'
属性内置函数
hasattr(ad,"name")  # 判断实例对象是否有对应属性
#|> True
hasattr(ad,"wight")
#|> False
getattr(ad,"name")  # 获得实例对象相应属性的值,若对应属性不存在会报错
#|> '张三'
setattr(ad,"name","王五") # 设置实例对象其属性的值,若对应属性存在,则更改属性值,若对应属性不存在,则新增该属性,并设置相应的属性值
ad.name
#|> '王五'
delattr(ad,"name") # 删除改实例对象的相应属性


class shanxi(Person):
    pass

issubclass(shanxi,Person)  # 判断前一个类是否是后面所有类中任意一个的后代
#|> True
issubclass(shanxi,object)
#|> True
issubclass(shanxi,(Person,object))
#|> True
isinstance(ad,Person) # 判断前一个实例对象,是否是任一类及其父类的实例化
#|> True
isinstance(ad,object)
#|> True
isinstance(ad,shanxi)
#|> False
isinstance(1,(int,str))
#|> True
ad.__getattribute__("age")
#|> 19
魔法函数
'''
魔法方法:
	1.本质时函数
	2.左右两边都是两个下划线,中间是固定的英文单词,是魔法方法
	3.在特定场景下由python解释器自动调用,具有特定的功能

__init__: 
	场景:在实例化对象是自动调用
	作用:实例对象初始化时,构造实例对象的私有属性
__del__:
	场景:在删除实例对象时自动调用,
	方法:del 对象
	作用:在析构对象之后要运行的代码,实质是给提示
__new__:
	场景:在实例化对象是自动调用,最先调用
	作用:创建实例对象,主要用于单例模式
__str__:
	场景:在print()打印对象时自动调用
	作用:改变输出的结果,
	优先级: 高于repr,即没有str时,print()会输出repr内容
__repr__:
	场景:在直接引用对象时自动调用
	作用:改变输出结果
'''
class Person(object):
    color = "yellow"

    def __init__(self,name,age):
        self.name = name
        self.age = age
     
    def play(self):
        print(f"{self.name}正在吃晚饭!")


    def __getattr__(self,item):  # 属性不存在时自动调用
        print("该属性不存在")

单例模式
class Person(object):
    color = "yellow"

    def __init__(self,name,age):
        self.name = name
        self.age = age
        print("init")

    def __new__(cls,*args,**kwargs): # 重写new方法,cls代表类本身
        if not hasattr(cls,"_instance"): # 当前类是否有随意命名的属性,若没有该属性则创建属性并赋予一个实例对象
            cls._instance = super().__new__(cls)  # 继承父类new方法,创建一个实例对象
        print("new")
        return cls._instance # 返回的实例对象会被init所接受,并对实例初始化
        


    def play(self):
        print(f"{self.name}正在吃晚饭!")


    def __getattr__(self,item):
        print("该属性不存在")

    def __str__(self): # 实例对象print()时输出的内容
        return "这个{Person}类str!"

    def __repr__(self): # 实例对象直接引用时的输出的内容
        return "这个{Person}类repr!"



ad = Person("张三",19)
adn = Person("李四",45)
#|> new   # ad这个对象在实例初始化时,先执行new创建实例,再执行init进行实例初始化,
#|> init
#|> new
#|> init
ad.name # 单例模式,只会显示最新值
#|> '李四'
ad.age
#|> 45
ad
#|> 这个{Person}类repr!
print(ad)
#|> 这个{Person}类str!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值