10、类
1、静态字段和普通字段
class Foo: #静态字段,保存在类的内存 cc='1234' def __init__(self): #动态字段(普通字段),保存在对象中 self.name = 'alex' def show(self): print(self.name) ''' 如果普通字段是一个固定的值,像 country = ‘china’一样,每个类中都会有 造成内存浪费,所有将有固定值得普通字段改成静态字段 静态字段在加载代码的时候创建,普通字段在创建实例的时候创建 ''' class province(): def __init__(self,name): self.name = name country = 'china' hn= province('henan') hb = province('hebei') ''' 普通字段只能用对象访问 静态字段用类访问(万不得已的时候用对象访问) ''' class province(): country = 'china' #普通方法,由对象去调用执行(方法属于类) def __init__(self,name): self.name = name hn= province('henan') print(province.country) print(hn.country)
2、静态方法,类方法
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ''' 普通方法:至少一个self 对象执行 静态方法:任意参数,没有self 类执行(对象也可以执行) 类方法:至少一个cls 类执行(对象也可以执行) ''' '''静态方法''' class province(): country = 'china' '''普通方法,由对象去调用执行(方法属于类)''' def __init__(self, name): self.name = name def show(self): print(self.name) ''' 静态方法,通过类调用,和静态字段相似,在不创建对象的时候可以调用 相当于python的函数,写在类里面的原因是因为和类相关,如果和类都没有关系 完全可以单独写一个函数 ''' @staticmethod def f1(arg1,arg2): print(arg1,arg2) ''' 类方法,必须有的一个参数是cls,类方法是静态方法的一种特殊情况,和静态方法对比来说 类方法会自动传给类方法一个类名,而静态方法不会传递 参数cls:这个类的类名 ''' @classmethod def f2(cls): print(cls) province.f1('a','b') class province(): def __init__(self,all_count): self.all_count = all_count ''' 属性:调用的时候不用加() 此时,只能取值,不能传值,如果想要传值,则要重新写一个名字相同的方法 然后加一个装饰器,@函数名.setter 如果想要删除,加一个装饰器 @函数名.deleter 综合以上可以用这样的形式: def f1(): pass def f2(): pass def f3(): pass foo = property(fget = f1, fset = f2, fdel = f3) 在类外面,这样调用: p.foo ==> fget=all_pager() p.foo = '100' ==> fset=all_pager() del p.foo ==> fdel=all_pager() ''' @property def all_pager(self): print(self.all_count) @all_pager.setter def all_pager(self,value): print(value) @all_pager.deleter def all_pager(self): print('del all_pager') p = province(100) # p.all_count() p.all_pager p.all_pager = 10 del p.all_pager #关联方式,这个代码会执行
3、私有字段
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= class foo: '''私有静态字段 和私有字段一样,只能在类内进行访问 ''' __cc = '123' def __init__(self,name,age): '''共有字段''' self.name=name '''私有字段,只能在本类内使用,继承也不行''' self__age = age obj = foo('name',23) print(obj.name) ''' print(obj.age) 由于age是私有字段,所有在类外访问的时候会异常, AttributeError: 'foo' object has no attribute 'age'''