1.容易混淆的定义
实例变量前需要加self.
,表明这个变量属于实例,实例变量通过“对象.实例变量”的方法进行访问
同样在实例方法中,也需要在第一个参数中填入self
,表明这个方法属于实例
而类变量可以直接定义在类中,类变量的访问需要用“类名.类变量”
类方法则需要在前加上@classmethod
装饰器进行说明,它不属于个体实例,它的第一个参数不是self,而是类本身,既可以写cls
,也可以用类本身的名字来作为第一个参数,但是类方法中不能调用实例变量
class Account():
index_number = 5 # 类变量
def __init__(self):
self.index_number = 5 # 实例变量
def show_index(self): # 实例函数
print(self.index_number)
print(index_number) # 这么写是错误的
@classmethod
def show_classindex(cls): # 类方法
print(cls.index_number)
print(self.index_number) # 这么写是错误的
return 0
a = Account()
Account.show_classindex() # 类方法的使用
a.show_index() # 实例方法的使用
总而言之,实例与类之间是不能互相调用的
2.封装性
1.私有变量/方法
定义私有的方式是在变量和方法名前加两个下划线
__index_number
def __show_index(self):
这样该变量/方法只能在类内访问
但是实际上这种定义方法是一种弱私有的方法,python会将该变量/方法的名字自动改为_classname__index_number
,在外部使用时,只要用这个变量名就可以进行更改
如在上面的代码中新增私有变量
self.__index_number = 10
print(a._Account__index_number)
即可访问
那么此时可以使用强私有方法
self.__index_number__ = 10
这样在类之外便无法对其进行访问
2.类属性
通过装饰器@property
可以将实例方法改变为类属性,这样便可以通过实例方法方便地改变私有变量的值
class Account():
def __init__(self, index_number):
self.__index_number = index_number
@property
def pri(self): # 类属性的定义
return self.__index_number
@pri.setter # 类属性设置方法
def pri(self, index_number):
self.__index_number = index_number
@pri.deleter # 析构函数
def pri(self):
del self.__index_number
a = Account(11)
a.pri = 15
print(a.pri)
3.继承性
python中子类可以继承父类除了私有变量和方法之外的所有变量和方法
class Father():
def __init__(self, name):
self.name = name
def call_father_name(self):
print(self.name)
class Son(Father): # 继承父类
def __init__(self, name, age):
super().__init__(name) # 调用父类构造方法
self.age = age
def call_father_age(self):
print(self.age)
father = Son('Tony', 43)
father.call_father_name()
father.call_father_age()
print(father.name)
所以在构造子类方法时,会先构造父类方法,然后继承父类中的变量和方法,之后便可以对这些变量和方法进行调用
python中子类是可以继承多个父类的,继承时会从左到右进行继承,对于同名变量和方法优先继承左边的
子类如果定义了与父类相同的方法名,子类方法会重写(override)父类的同名方法