@SuHongjun
2020-05-07T10:00:40.000000Z
字数 2980
阅读 208
Python
2020春季学期
类实例化之后,可以动态增加实例属性,但增加的实例属性仅仅是影响该实例
class A():
m = 10
n = m+ 5
def get_m(self):
return self.m
def get_n(self):
return self.n
x=A()
x.name = "李小平" #类实例化之后,可以动态增加实例属性
x.a = 99
y=A()
>>> x.name #引用对象x动态增加的实例属性
'李小平'
>>> x.a #引用对象x动态增加的实例属性
99
>>> y.name #AttributeError: 'A' object has no attribute 'name' #对象y并没有name这个实例属性
>>> y.a #AttributeError: 'A' object has no attribute 'a' #对象y并没有a这个实例属性
类属性的基本用法:
class A():
n = 5
def get_n(self):
return self.n
m = n+10
def get_m(self):
return self.m
x=A()
y=A()
>>> x.m
15
>>> x.n
5
>>> y.m
15
>>> y.n
5
>>> y.get_n()
5
>>> y.get_m()
15
>>> A.n = 7 #修改了类属性, 注意A没有带()
>>> y.n #修改了类属性之后,对象引用的类属性的值也随之变化了
7
>>> y.m #修改了类属性n之后,类属性m并未随之变化,m=n+10只在第一次引入类的时候执行
15
>>> y.get_m()
15
>>> y.get_n()
7
类属性与实例属性:
class A():
m = 10
n = m+ 5
def get_m(self):
return self.m
def get_n(self):
return self.n
x=A()
y=A()
>>> x.m
10
>>> x.n
15
>>> y.m
10
>>> y.n
15
>>> x.m = 4 #这里并不是修改类属性m,而是给x创建了一个实例属性m
>>> x.m #当实例属性和类属性重名的时候,实例属性会屏蔽类属性
4
>>> x.n
15
>>> y.m
10
>>> y.n
15
>>> del(x.m) #删除x的实例属性m
>>> x.m #x的实例属性m被删除后,x.m又开始引用被屏蔽了的类属性m
10
>>> del(y.m) #AttributeError: m #不能通过对象删除类属性
>>> del(A.m) #删除类属性
>>> x.m #AttributeError: 'A' object has no attribute 'm' #类属性被删除后,不能再通过对象来引用类属性
>>> y.m #AttributeError: 'A' object has no attribute 'm' #类属性被删除后,不能再通过对象来引用类属性
__开头,而不以__结束
class A():
__m = 10
n = __m+ 5
def get_m(self):
return self.__m
def __get_n(self):
return self.n
x=A()
>>> x.__m #__m是私有属性,不能再通过对象直接引用
Traceback (most recent call last):
File "<pyshell#46>", line 1, in <module>
x.__m
AttributeError: 'A' object has no attribute '__m'
>>> x.n
15
>>> x.get_m() #但是可以通过公有方法获取私有属性的值
10
>>> x.__get_n() #私有方法,不能通过对象调用
Traceback (most recent call last):
File "<pyshell#49>", line 1, in <module>
x.__get_n()
AttributeError: 'A' object has no attribute '__get_n'
>>>
class A():
__m__ = 10
n = __m__+ 5
def get_m(self):
return self.__m__
def __get_n__(self):
return self.n
x=A()
>>> x.__m__ #__m__ 以__开头,并且以__结束,不是私有属性,可访问
10
>>> x.n
15
>>> x.get_m()
10
>>> x.__get_n__() #__get_n__() 以__开头,并且以__结束,不是私有方法,可访问
15
__开头,以__结束
用dir()查看
class A():
m = 10
n = m + 5
def get_m(self):
return self.m
def get_n(self):
return self.n
x=A()
>>> dir(A)
['__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__() 方法是一个特殊的实例方法。每当创建一个类的实例对象时,Python 解释器都会自动调用它。即便类中没有构造方法,Python 也会自动为类添加一个仅包含 self 参数的构造方法。
__new__() and __init__() work together in constructing objects (__new__() to create it, and __init__() to customize it)
class people( ):
'''这里是类的说明文档'''
def __init__(self,name): #实例方法同样要遵守函数的参数规则
self.name = name
>>> a = people('赵云') #实例化对象时候的参数要与__init__()保持一致
>>> a.name
'赵云'
>>> a = people() #没有按照__init__()的参数列表传递参数,所以出错
TypeError: __init__() missing 1 required positional argument: 'name'
class people( ):
'''这里是类的说明文档'''
def __init__(self,name='某人'): #实例方法同样要遵守函数的参数规则
self.name = name
>>> a = people() #实例化对象时候的参数要与__init__()保持一致
>>> a.name
'某人'
除了 init(self) 之外,Python 类中还含有很多特殊成员,包括 del(self)、new(self) 、dir(self)等。