@SuHongjun
2020-05-07T10:00:40.000000Z
字数 2980
阅读 237
Python 2020春季学期
类实例化之后,可以动态增加实例属性,但增加的实例属性仅仅是影响该实例
class A():m = 10n = m+ 5def get_m(self):return self.mdef get_n(self):return self.nx=A()x.name = "李小平" #类实例化之后,可以动态增加实例属性x.a = 99y=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 = 5def get_n(self):return self.nm = n+10def get_m(self):return self.mx=A()y=A()>>> x.m15>>> x.n5>>> y.m15>>> y.n5>>> 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 = 10n = m+ 5def get_m(self):return self.mdef get_n(self):return self.nx=A()y=A()>>> x.m10>>> x.n15>>> y.m10>>> y.n15>>> x.m = 4 #这里并不是修改类属性m,而是给x创建了一个实例属性m>>> x.m #当实例属性和类属性重名的时候,实例属性会屏蔽类属性4>>> x.n15>>> y.m10>>> y.n15>>> del(x.m) #删除x的实例属性m>>> x.m #x的实例属性m被删除后,x.m又开始引用被屏蔽了的类属性m10>>> 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 = 10n = __m+ 5def get_m(self):return self.__mdef __get_n(self):return self.nx=A()>>> x.__m #__m是私有属性,不能再通过对象直接引用Traceback (most recent call last):File "<pyshell#46>", line 1, in <module>x.__mAttributeError: 'A' object has no attribute '__m'>>> x.n15>>> 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__ = 10n = __m__+ 5def get_m(self):return self.__m__def __get_n__(self):return self.nx=A()>>> x.__m__ #__m__ 以__开头,并且以__结束,不是私有属性,可访问10>>> x.n15>>> x.get_m()10>>> x.__get_n__() #__get_n__() 以__开头,并且以__结束,不是私有方法,可访问15
__开头,以__结束
用dir()查看
class A():m = 10n = m + 5def get_m(self):return self.mdef get_n(self):return self.nx=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)等。