[关闭]
@SuHongjun 2020-05-07T10:00:40.000000Z 字数 2980 阅读 208

Python-Day 19:类和对象 - 基础知识2

Python 2020春季学期


再论属性

类实例化之后,可以动态增加实例属性,但增加的实例属性仅仅是影响该实例

  1. class A():
  2. m = 10
  3. n = m+ 5
  4. def get_m(self):
  5. return self.m
  6. def get_n(self):
  7. return self.n
  8. x=A()
  9. x.name = "李小平" #类实例化之后,可以动态增加实例属性
  10. x.a = 99
  11. y=A()
  12. >>> x.name #引用对象x动态增加的实例属性
  13. '李小平'
  14. >>> x.a #引用对象x动态增加的实例属性
  15. 99
  16. >>> y.name #AttributeError: 'A' object has no attribute 'name' #对象y并没有name这个实例属性
  17. >>> y.a #AttributeError: 'A' object has no attribute 'a' #对象y并没有a这个实例属性

类属性的基本用法:

  1. class A():
  2. n = 5
  3. def get_n(self):
  4. return self.n
  5. m = n+10
  6. def get_m(self):
  7. return self.m
  8. x=A()
  9. y=A()
  10. >>> x.m
  11. 15
  12. >>> x.n
  13. 5
  14. >>> y.m
  15. 15
  16. >>> y.n
  17. 5
  18. >>> y.get_n()
  19. 5
  20. >>> y.get_m()
  21. 15
  22. >>> A.n = 7 #修改了类属性, 注意A没有带()
  23. >>> y.n #修改了类属性之后,对象引用的类属性的值也随之变化了
  24. 7
  25. >>> y.m #修改了类属性n之后,类属性m并未随之变化,m=n+10只在第一次引入类的时候执行
  26. 15
  27. >>> y.get_m()
  28. 15
  29. >>> y.get_n()
  30. 7

类属性与实例属性:

  1. class A():
  2. m = 10
  3. n = m+ 5
  4. def get_m(self):
  5. return self.m
  6. def get_n(self):
  7. return self.n
  8. x=A()
  9. y=A()
  10. >>> x.m
  11. 10
  12. >>> x.n
  13. 15
  14. >>> y.m
  15. 10
  16. >>> y.n
  17. 15
  18. >>> x.m = 4 #这里并不是修改类属性m,而是给x创建了一个实例属性m
  19. >>> x.m #当实例属性和类属性重名的时候,实例属性会屏蔽类属性
  20. 4
  21. >>> x.n
  22. 15
  23. >>> y.m
  24. 10
  25. >>> y.n
  26. 15
  27. >>> del(x.m) #删除x的实例属性m
  28. >>> x.m #x的实例属性m被删除后,x.m又开始引用被屏蔽了的类属性m
  29. 10
  30. >>> del(y.m) #AttributeError: m #不能通过对象删除类属性
  31. >>> del(A.m) #删除类属性
  32. >>> x.m #AttributeError: 'A' object has no attribute 'm' #类属性被删除后,不能再通过对象来引用类属性
  33. >>> y.m #AttributeError: 'A' object has no attribute 'm' #类属性被删除后,不能再通过对象来引用类属性

私有成员(属性、方法)

  1. __开头,而不以__结束
  1. class A():
  2. __m = 10
  3. n = __m+ 5
  4. def get_m(self):
  5. return self.__m
  6. def __get_n(self):
  7. return self.n
  8. x=A()
  9. >>> x.__m #__m是私有属性,不能再通过对象直接引用
  10. Traceback (most recent call last):
  11. File "<pyshell#46>", line 1, in <module>
  12. x.__m
  13. AttributeError: 'A' object has no attribute '__m'
  14. >>> x.n
  15. 15
  16. >>> x.get_m() #但是可以通过公有方法获取私有属性的值
  17. 10
  18. >>> x.__get_n() #私有方法,不能通过对象调用
  19. Traceback (most recent call last):
  20. File "<pyshell#49>", line 1, in <module>
  21. x.__get_n()
  22. AttributeError: 'A' object has no attribute '__get_n'
  23. >>>
  1. class A():
  2. __m__ = 10
  3. n = __m__+ 5
  4. def get_m(self):
  5. return self.__m__
  6. def __get_n__(self):
  7. return self.n
  8. x=A()
  9. >>> x.__m__ #__m__ 以__开头,并且以__结束,不是私有属性,可访问
  10. 10
  11. >>> x.n
  12. 15
  13. >>> x.get_m()
  14. 10
  15. >>> x.__get_n__() #__get_n__() 以__开头,并且以__结束,不是私有方法,可访问
  16. 15

特殊成员(属性、方法)

  1. __开头,以__结束

用dir()查看

  1. class A():
  2. m = 10
  3. n = m + 5
  4. def get_m(self):
  5. return self.m
  6. def get_n(self):
  7. return self.n
  8. x=A()
  9. >>> dir(A)
  10. ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'get_m', 'get_n', 'm', 'n']

特殊的实例方法: init() 初始化方法

  1. __init__() 方法是一个特殊的实例方法。每当创建一个类的实例对象时,Python 解释器都会自动调用它。即便类中没有构造方法,Python 也会自动为类添加一个仅包含 self 参数的构造方法。
  2. __new__() and __init__() work together in constructing objects (__new__() to create it, and __init__() to customize it)
  1. class people( ):
  2. '''这里是类的说明文档'''
  3. def __init__(self,name): #实例方法同样要遵守函数的参数规则
  4. self.name = name
  5. >>> a = people('赵云') #实例化对象时候的参数要与__init__()保持一致
  6. >>> a.name
  7. '赵云'
  8. >>> a = people() #没有按照__init__()的参数列表传递参数,所以出错
  9. TypeError: __init__() missing 1 required positional argument: 'name'
  1. class people( ):
  2. '''这里是类的说明文档'''
  3. def __init__(self,name='某人'): #实例方法同样要遵守函数的参数规则
  4. self.name = name
  5. >>> a = people() #实例化对象时候的参数要与__init__()保持一致
  6. >>> a.name
  7. '某人'

除了 init(self) 之外,Python 类中还含有很多特殊成员,包括 del(self)、new(self) 、dir(self)等。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注