1.
# 对象的奥义在于,他本身是讲程序整合(就是把一个个功能进行分区,这样就可以任意的调用了!!)
# python的类中不仅可以有定义函数和变量,也可以包括其他任何的代码!!
class student:
name = "zhangsan"
def func01(self):
print("水墨画")
print(123)
for i in range(10):
print(i,end=" ")
# 由此可见,类体的代码在其定义的阶段就会执行(主要是除了函数和变量外的其他的代码)
2.
函数里面的变量要想访问函数体之外的成员变量,那么就必须加上self.变量名的形式才可以,不加self,只有变量名字只会访问局部变量,如果该局部变量没有被定义,就会报错!!!
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作为前缀,同一个类的不同对象(实例)的数据成员之间互不影响;
属于类的数据成员是该类所有对象共享的,不属于任何一个对象,在定义类时这类数据成员一般不在任何一个成员方法的定义中。
如果同样的属性名称同时出现在实例和类中,则属性查找会优先选择实例