4.1.3 数据成员

  数据成员用来说明对象特有的一些属性,如人的身份证号、姓名、年龄、性别、身高、学历,汽车的品牌、颜色、最高时速,蛋糕的名称、尺寸、配料,书的名字、作者、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 '''

 

posted @ 2018-03-23 23:57  Avention  阅读(515)  评论(0编辑  收藏  举报