zoukankan      html  css  js  c++  java
  • 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 '''
  • 相关阅读:
    dba_tables表中的num_rows与count(*)的值为何不同
    Mysql查询数据库中的表名/模糊查询
    Nginx配置静态文件(浏览器的缓存)
    UEditor支持数学公式
    小程序H5的自动登录(后台Shiro)
    Ubuntu的邮件发送
    Infosec Tool List
    检测configMap,重载Pod内的业务容器
    CNI calico插件使用注意事项
    kspan 集群度量方案
  • 原文地址:https://www.cnblogs.com/avention/p/8631765.html
Copyright © 2011-2022 走看看