【PyQt5 基础之 Python 备忘录】- 08 - 类、对象、属性、魔术方法

8 类、对象、属性、魔术方法

python 是动态语言,时刻谨记

8.1 类的组成、定义
  • 组成三部分: 类名 + 属性(一组数据) + 方法(允许对类进行操作的函数)

  • 定义:语法是 class 类名 : , 注意冒号别忘,举例如下:

    class Person:
        name = 'mark'
        age = '20'
    
        def get_name(self):
            return self.name
    
        def get_age(self):
            return self.age
    
8.2 对象实例
  • 语法:对象名 = 类名() ,接着上面的例子:

    xiaoming = Person()  # xiaoming 就是 Person 类的一个实例
    print(xiaoming.get_name())
    # ----- output
    mark
    
8.3 类属性 vs. 实例属性
  • 在类内,方法之外的定义的变量是类变量

  • 使用 self 关键字定义在方法内容的是实例属性

    class Person:
        name = 'mark' # 类属性
        age = '20'    # 类属性
    
        def __init__(self):   
            self.val = 12345   # 实例属性
    
  • python 语言的神奇之处,类对象实例化后,可以动态增加属性和方法,

    class Person:
        name = 'mark'
    
        def get_name(self):
            return self.name
    
    aaa = Person()
    aaa.age = 25    # 这里并不会报错,会将 age 视为实例属性
    print(aaa.age)
    # ----- output
    25
    
  • 类属性是在类中定义的属性,和类绑定,类中的所有对象都可访问,可通过类名访问,也可通过实例名访问,关于类属性和实例属性的讨论,可以参考这篇Python 类属性与实例属性

  • 其根本区别在于保存位置和调用对象不用,类属性可被类和实例调用,而实例属性只能由实例访问

    class Car:
        name = 'Jetta'
        year = 2000
    
        def __init__(self):
            odom = 5000
    
    car1 = Car()
    car2 = Car()
    print(car1.name, car2.name) # 实例调用实例属性
    car1.name = 'audi'  # 实例改变类属性
    car3 = Car()		# 实例改变类属性后,新建实例
    print(car1.name, car2.name,car3.name) # 实例的属性变化,类属性不变化
    print(Car.year) # 类调用类属性
    print(Car.odom) # 类调用实例属性 打咩 AttributeError: type object 'Car' has no attribute 'odom'
    
    # ----- output
    Jetta Jetta
    audi Jetta Jetta
    2000
    
8.4 __init__ 干什么用
  • 一次性把实例属性都配置好,类似于 c++ 中的构造函数,在实例化对象时会自动调用该函数,这种双下划线的也叫魔术方法

    class Car:
        name = 'Jetta'
        year = 2000
    
        def __init__(self, odom, color, engine): # 直接声明参数
            self.odom = odom
            self.color = color
            self.engine = engine
    
        def print_info(self):
            print(self.odom, self.color, self.engine)
    
    
    car1 = Car(2000, 'black', 'v6') # 实例化时直接传入参数
    car1.print_info()
    
8.5 self 是个啥,有啥用
  • 和对象指向同一个内存地址,可认为是对象的引用;

  • 某个对象调用方法时,python 解释器会把该对象作为第一参数传递给 self ,我们只需关心后面参数的赋值

  • self 的名字是可改的,只是约定俗成写为 self:

    class Car:
        name = 'Jetta'
        
        def print_info(self):
            print('self = {}'.format(id(self)))
    
    car1 = Car()
    car1.print_info()
    print('car1 = {}'.format(id(car1)))
    
    # ----- output
    self = 140028971955248 # 一样的玩意
    car1 = 140028971955248
    
8.6 魔术方法简介
  • 魔术方法是 python 中已定义的一些,可重载的函数,有特殊的功效,用两个下划线包起来;

  • 举例说明 __str__ ,通过重载这个函数,可以实现类对象的信息打印,其他魔术函数见 python 文档。

    class Car:
        name = 'Jetta'
    
        def __str__(self):
            return '<class> Car object id = {}'.format(id(self))
    
    car1 = Car()
    print(car1) # 直接打印对象
    # ----- output
    <class> Car object id = 140377728816176
    
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值