数据成员用来说明对象特有的一些属性,如人的身份证号、姓名、年龄、性别、身高、学历,汽车的品牌、颜色、最高时速,蛋糕的名称、尺寸、配料,书的名字、作者、ISBN、出版社、出版日期,等等。
数据成员大致可以分为两类:属于对象的数据成员和属于类的数据成员。
属于对象的数据成员主要指在构造函数__init__()中定义的(当然也可以在其他成员方法中定义),定义和使用时必须以self作为前缀(这一点是必须的),同一个类的不同对象(实例)之间的数据成员之间互不影响;
属于类的数据成员是该类所有对象共享的,不属于任何一个对象,在定义类时这类数据成员不在任何一个成员方法的定义中。在主程序中或类的外部,对象数据成员属于实例(对象),只能通过对象名访问;而类数据成员属于类,可以通过类名或对象名访问。另外,在Python中可以动态地为类和对象增加成员,这也是Python动态类型的一种重要体现。
1 class Car(object):
2 price = 100000 #属于类的数据成员
3
4 def __init__(self,c):
5 self.color = c #属于对象的数据成员
6
7 if __name__ == '__main__':
8
9 car1 = Car('red') #实例化两个对象
10 car2 = Car('blue')
11
12 print(car1.color,Car.price) #访问对象和类的数据成员
13
14 Car.price = 110000 #修改类的属性
15
16 Car.name = 'QQ' #动态增加类的属性
17 car1.color = 'yellow' #修改实例的属性
18
19 print(car2.color,Car.price,Car.name)
20 print(car1.color,Car.price,Car.name)
21
22 #定义一个函数
23 def setSpeed(self,s):
24 self.speed = s
25
26 #导入types模块
27 import types
28
29 #动态为对象增加成员方法
30 car1.setSpeed = types.MethodType(setSpeed,car1)
31
32 #调用对象的成员方法
33 car1.setSpeed(50)
34 print(car1.speed)
35
36
37 #程序执行结果:
38 # red 100000
39 # blue 110000 QQ
40 # yellow 110000 QQ
41 # 50
#测试一下car2能否访问到为car1对象增加的成员方法
car2.setSpeed(30)
print(car2.speed)
#果然不出我所料,报错了,说明为car1动态增加的方法只能被car1引用
安利一篇文章,URL:https://blog.csdn.net/icelamp/article/details/8903298
题目:python中为类和实例动态增加方法
1 def func(a,b):
2 print(a,b)
3
4 class Foo(object):
5 pass
6
7 foo = Foo()
8
9 foo.func(4,1) #会报错,因为实例foo没有func成员方法
10
11
12 #类动态增加方法:直接赋值
13 Foo.func = func
14
15 # 实例这样做是不行的,得到的只是一个可调用的属性
16 foo.func2=func
17
18
19
20 # Python: 为对象动态添加函数,且函数定义来自一个str
21 # 在Python中,通常情况下,你只能为对象添加一个已经写好的方法
22 # 需求:传入一个str类型的变量,其值是一个完整的合法的Python函数定义,然后为一个对象添加这个函数:
23
24 method_str = u'''
25 def say(self, name)
26 print 'My nameis', name
27 '''
28
29 class MyClass:
30 def __init__(self):
31 pass
32
33 def extends(self, method_name, method_str):
34
35 pass
36
37
38 obj =MyClass()
39 obj.extends('say', method_str)
40 obj.say('wendal') #打印出My name is wendal
拓展知识:利用类数据成员的共享性,可以实时获得该类的对象数量,并且可以控制该类可以创建的对象最大数量。例如:
1 class Demo(object):
2 total = 0
3
4 # 该方法在__init__()之前被调用
5 def __new__(cls,*args,**kwargs):
6 if cls.total >= 3:
7 raise Exception('最多只能创建3个对象')
8 else:
9 return object.__new__(cls)
10
11 def __init__(self):
12 Demo.total = Demo.total + 1
13
14 if __name__ == '__main__':
15 t1 = Demo()
16 t2 = Demo()
17 t3 = Demo()
18 t4 = Demo()
19
20 '''
21 Traceback (most recent call last):
22 File "C:/Users/dddd/PycharmProjects/untitled5/test1.py", line 18, in <module>
23 t4 = Demo()
24 File "C:/Users/dddd/PycharmProjects/untitled5/test1.py", line 7, in __new__
25 raise Exception('最多只能创建3个对象')
26 Exception: 最多只能创建3个对象
27 '''