class student: name = "zhangsan" def func01(self): print("水墨画") print(123) for i in range(10): print(i,end=" ")
class student: name = "zhangsan"#类的数据类型(成员变量) def func01(self):#self代表正在调用该函数的对象 name = "lisi" print(name)#局部变量name,这个局部变量是不会访问def函数之外的变量的 print(self.name)#成员变量name print(student.name)#成员变量name student().func01()#创建个匿名的对象!
3.构造方法,和变量的访问。
class student: name = "zhangsan" def __init__(self):#这是个构造方法,这种方法的优点在于可以在对象构造的时候就会立刻执行。 # self.name = "wangwu"#类变量已经有的变量会覆盖原来的变量值 self.age = 18#类变量中之前没有声明的变量,会进行创建,不过,如果这个变量的创建不是在 # 构造方法里面的话,实在一个普通的实例方法的里面,那么那个对象调用这个函数,那么这个变量就会成为这个对象的私有方法 def func01(self): print(self.name) print(self.age) # print(student.age)#报错,对象的数据是不会共享给类的 student().func01()#通过函数访问变量 print(student.name)#通过.的形式进行访问对象
# 总结:
# 1.self指代的变量是这个正在调用的对象的变量,
# 这个对象独有的变量是不会共享给类的,但是类的成员变量, 这个对象是可以访问的,
所以student.name和self.name的区别在与,前者不可以访问后者的name,但是后者可以访问前者的name。
# 2.构造方法内可以存放除了对象功能的任何的代码,只要想创建对象后立即执行的都可以
# 而且构造方法可以调用类中的任何函数。构造方法的返回值是none
4.类和对象的共享关系
class student: name = "zce" count = 0 def __init__(self): student.count = student.count+1#这样可以统计这个对象创建的次数 # 类的数据是共享给所有的对象的 stu01 = student() stu02 = student() stu03 = student() stu01.name ="kb"#只会改变stu01的name student.name ="ece"#即便类的变量发生改变,那么已经改变的对象的变量也不会改变 print(stu01.name)#相当于self.name,名称空间作用域的问题 print(stu02.name) print(stu03.name) print(student.name)
5.
class A: x = 100 #x是友好的 def __init__(self, value1=0, value2=0): #__init__相当于java里的构造函数 #self指的是正在调用函数的对象,相当于java里的this self._value1 = value1 #保护成员 self.__value2 = value2 #私有成员 self.value = value1 + value2 def setValue(self, value1, value2): self._value1 = value1 self.__value2 = value2 def show(self): print(self._value1,self.value,self.__value2) a = A() #创建类的新实例并将此对象分配给局部变量a #构造方法中的是关键字形参,那么再给构造方法传值的时候,可传可不传 a.setValue(2,5) a.show() print(a._value1) #访问保护变量 print(a._A__value2)#访问私有变量 print(a.x)#访问友好类型的变量
Python中,约定:
_xxx:受保护成员;一般建议类对象和子类对象访问,不建议通过对象直接访问
__xxx__:系统定义的特殊成员;
__xxx:私有成员,只有类对象自己能访问,子类对象不能直接访问到这个成员,但在对象外部可以通过“对象名._类名__xxx”这样的特殊方式来访问。
注意:Python中不存在严格意义上的私有成员。
数据成员可以大致分为两类:属于对象的数据成员和属于类的数据成员。
属于对象的数据成员一般在构造方法__init__()中定义,当然也可以在其他成员方法中定义,在定义和在实例方法中访问数据成员时以self作为前缀,同一个类的不同对象(实例)的数据成员之间互不影响;
属于类的数据成员是该类所有对象共享的,不属于任何一个对象,在定义类时这类数据成员一般不在任何一个成员方法的定义中。
如果同样的属性名称同时出现在实例和类中,则属性查找会优先选择实例