Python系统学习第十三课

本文深入探讨Python中类的成员描述符,包括属性案例、描述符的get、set和delete操作,以及如何使用property函数控制类属性。同时,介绍了类的内置属性和魔术方法,如构造函数、对象实例化方法、对象作为函数使用时触发的方法等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类的成员描述符(属性)

  • 属性案例
  • 创建Student类,描述学生
  • 学生具有student.name属性
  • 但是格式并不统一
class Student():
    def __init__(self, name, age):
        self.name = name
        self.age = age
        
    def indr(self):
        print("my name is {0}".format(self.name))
        
s1 = Student("liziqiang ", 18)
s2 = Student("liuyahui", 22)
s1.indr()
s2.indr()
my name is liziqiang 
my name is liuyahui
  • 类的成员描述符是为了在类中对累的成员属性进行相关操作二创建的一种方式
    • get:获取属性的操作
    • set:修改或者添加属性操作
    • delete:删除属性的操作
  • 如果想使用类的成员描述符,大概有三种方法
    • 使用类实现描述器

    • 使用属性修饰符

    • 使用Property函数

      • property函数很简单
      • property(fget,fset, fdel, doc)
#peroperty案例
#定义一个 Person类,具有name,age属性
#对于任意输入的姓名,大写方式保存
#年龄,我们希望内部统一用整数保存
#x = property(fget, fset, fdel, doc)
class Person():
    def fget(self):
        return self._name * 2
    def fset(self, name):
        self._name = name.upper()
    def fdel(self):
        self._name = "Noname"
        
    name = property(fget, fset, fdel, "对name进行操作")
p1 = Person()
p1._name = "lizi"
print(p1.name)
lizilizi

无论那种修饰符都是为了队成员属性进行相应的控制

  • 类的方式:适合多各类中的多个属性共用一个描述符
  • property:适合当前类中使用,可以控制一哥类中多个属性
  • 属性修饰符:使用于当前类中使用,控制一个类中的一个属性

类的内置属性

  • dict:以字典的方式显示类的成员组成
  • doc:获取类的文档信息
    -name:获取类的名字,如果在模块中使用,获取模块的名称
    -bases:获取某各类的所有父类,以元组的方式显示

类的常用魔术方法

  • 魔术方法就是不需要认为调用的方法,基本是在特定的时刻自动触发
  • 魔术方法的统一特征,方法名被前后各两个下划线包裹
  • 例如:‘init’:构造函数;‘new:对象实例化方法’,一般不需要使用;‘call’:对象当函数使用时触发;‘str’:当对象被当做字符串使用的时候调用;‘repr’:返回字符串;
#__call__举例
class A():
    def __init__(self, name = 0):
        print("mmmmm")
        
    def __call__(self):
        print("nnnnnn")
        
    def __str__(self):
        return "liziqiiang"
        
a = A()
a()  
print(a)
mmmmm
nnnnnn
liziqiiang

描述符相关

  • set:
  • get:
  • delete:

属性操作相关

  • getattr: 访问一个不存在的属性时触发
  • setattr:对成员属性进行设置的时候触发
    • 参数:self用来获取当前对象
    • 被设置的属性名称,以字符串形式出现
    • 需要对属性名称设置的值
    • 作用,进行属性设置的时候进行验证或者修改
    • 注意,在该方法中不能对属性直接进行赋值操作,否则死循环
class A():
    name = "name"
    age = 18
    def __getattr__(self, name):
        print("mmm")
        print(name)
        
a = A()
print(a.name)
print(a.addr)   #a和addr作为了两个参数传了进去


name
mmm
addr
None
#__setattr__案例
class Person():
    def __init__(self):
        pass
    def __setattr__(self, name, value):   #设置属性,name = age; value = 18
        print("设置属性:{0}".format(name))
        #下面的语句会导致死循环
        self.name = value
        #这种情况为了避免死循环,规定统一调用父类魔法函数
        super().__setattr__(name, value)
p =  Person()
print(p.__dict__)
p.age = 18
{}
设置属性:age

运算分类相关魔术方法

  • gt:进行大于判断的时候触发的函数
    • 参数:self
    • 第二个参数是第二个对象
    • 返回值可以是任意值,推荐返回布尔值
#__gt__举例
class Student():
    def __init__(self, name):
        self._name = name
    def __gt__(self, ojb):
        print("{0}mmmmmm{1}".format(self,ojb))
        return self._name > ojb._name
    
stu1 = Student("one")
stu2 = Student("second")

print(stu1 > stu2)
        
<__main__.Student object at 0x0000024C45061080>mmmmmm<__main__.Student object at 0x0000024C45061128>
False

类和方法的三种方法

  • 实例方法
    • 需要实例化对象才能使用的方法,使用过程中可能需要截止对象的其他对象的方法完成
  • 静态方法
    • 不需要实例化,通过类直接访问
  • 类方法
    • 不需要实例化,这类
#三种方法的案例
class Person():
    def eat(self):
        print(self)
        print("eating")
        
    #类方法
    #类方法的第一个参数,一般命名为cls,区别于self
    @classmethod
    def play(cls):
        print(cls)
        print("playing")
    
    #静态方法
    #不需要用第一个参数表示自身或者类
    @staticmethod
    def say():
        print("saying")
        
yueyue = Person()

#实例方法
yueyue.eat()
#类方法
Person.play()
#静态方法
Person.say()
yueyue.say()

<__main__.Person object at 0x0000024C4524A048>
eating
<class '__main__.Person'>
playing
saying
saying
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值