文章目录
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