1 class Foo: 2 country='中国'#类变量 3 def __init__(self,name): 4 self.name=name #实例变量 5 def func(self): 6 pass 7 obj=Foo('徐key') 8 obj1=Foo('战旗') 9 print(obj.name) 10 print(obj1.name) 11 12 obj.name='alex' 13 print(obj.name) 14 print(obj1.name) 15 16 obj.country='美国' 17 print(obj.country) 18 print(obj1.country) 19 20 Foo.country='美国' 21 print(obj.country) 22 print(obj1.country) 23 Foo.name='皇上' 24 print(obj.name) 25 print(obj1.name)
由上图 分别定义了类变量和实例变量 分析一下 将张庆 战旗 分别定义到实例变量中, 通过实例化对象,将他们两个值分别传入 obj,和obj1的内存地址和self 中, 12行单独修改时,会发生改变 但实质改变obj,16行同理,20行将类变量更改时则会发生全部改变
什么时候用全局变量 :
当需要每个相同字段都要改都要删时,可以将 实例变量(静态字段)提取到类变量中(字段)
私有变量: 在定义def__init__(self): self.__name=name 就是定义了一个私有变量
1 class Foo: 2 def __init__(self,name): 3 self.__name=name 4 self.age=13 5 def func(self): 6 print(self.__name) 7 obj=Foo("徐key") 8print(obj.__name)#报错 无法找到 9print(obj.age) #可以找到10 obj.func()#找到内部人员func,让它帮你执行内部私有__name
儿子不知道
1 class Base(object): 2 __secret='受贿' 3 def func1(self): 4 print(self.__secret) 5 class Foo(Base): 6 def func(self): 7 print(self.__secret) 8 obj=Foo() 9 print(Foo.__secret)#失败 10 print(self.__secret)#失败 11 obj.func1()
二:方法(实例方法,静态方法,类方法)
1 class Foo: 2 def __init__(self,name): 3 self.name=name 4 def func(self): 5 print(self.name) 6 @staticmethod 7 def display(a1,a2): 8 return a1+a2 9 @classmethod 10 def show(cls,x1,x2): 11 print(cls,x1,x2) 12 obj=Foo 13 #静态方法 14 #什么时候用静态方法:无需调用对象中封装的值,那么可以使用 15 print(Foo.display(1,2))#类+方法名() 16 print(obj.display(1,9))#对象+方法名() 17 #类方法 18 #什么使用类方法:如果在方法中使用当前类 19 Foo.show(1,5)#类+方法名
三.属性
1 lass Foo(object): 2 def __init__(self): 3 pass 4 @property#写一个函数就加一个 5 def start(self): 6 return 1 7 @property 8 def end(self): 9 return 5 10 obj=Foo() 11 print(obj.start) 12 print(obj.end)
编写时:只有一个self
调用时:无需加(),对象方法
应用:无需传值且有返回值