Python类
一.Python类中的私有变量和私有方法:
在Python中可以通过在属性变量名前加上双下划线定义属性为私有属性
特殊变量命名:
4、私有变量和属性只在自己的类中使用,在实例化对象中不能调用;
受保护类型的则可以实例化调用也可以修改
# 私有变量和属性只在自己的类中使用在实例化对象中不能调用
# 受保护类型的则可以实例化调用也可以修改
class Pub():
_name = 'protected类型的变量'
__info = '私有类型的变量'
def _func(self):
print("这是一个protected类型的方法")
print(self._name) # changed 实例化后可被修改
def __func2(self):
print('这是一个私有类型的方法')
def get(self):
return(self.__info)
p = Pub()
p._name = 'changed' # 可修改
print(p._name) # protected类型的变量
# print(p.__info) # 报错'Pub' object has no attribute '__info'
p._func() # 这是一个protected类型的方法
# p.__func2() # 报错 'Pub' object has no attribute '__func2'
print(p._Pub__info) # 私有类型的变量
print(p._Pub__func2()) # 这是一个私有类型的方法
对于上面访问私有变量和私有方法报错的方法,可以这样访问:
print(p._Pub__info) # 私有类型的变量
print(p._Pub__func2()) # 这是一个私有类型的方法
5、init的私有变量在实例化对象中不能修改,init的受保护变量在实例化对象中可以修改;其它普通属性可以任意修改,只对于本次实例化的对象(新的实例化对象值不影响)
# init的私有变量在实例化对象中不能修改
# init的受保护变量在实例化对象中可以修改
# 其它普通属性可以任意修改,只对于本次实例化的对象(新的实例化对象值不影响)
class A:
def __init__(self, a, b, c):
self.a = a
self.__b = b
self._c = c
def func(self):
print(self.a, self.__b, self._c)
s = A(1, 2, 3)
s.func() # 1 2 3
s.__b = 4
s.func() # 1 2 3 无法修改私有属性
s._c = 4
s.func() # 1 2 4 可修改受保护属性
二.继承和多态
1.继承可以得到父类的所有属性和方法
2.可以在父类方法的基础上修改增加新的功能
3.多态:数据类型可变
“开闭”原则:
对扩展开放:允许新增Animal子类;
对修改封闭:不需要修改依赖Animal类型的func()等函数
# 父类Animal() 子类 Dog()
# 使用isinstance()方法判断数据类型
a = Animal() # Animall类型
b = Dog() # Dog()类型
c = list() # list类型
print(isinstance(b, Animal)) # True
print(isinstance(a, Dog)) # False
print(isinstance(b, Dog)) # True
# 在继承关系中,如果一个实例的数据类型是某个子类,那它的数据类型也可以被看做是父类
# 但是,反过来就不行
三.类和函数的变量作用域:
函数局部变量外部不可以改变:
# 函数局部变量外部不可改变
# 局部变量作用域只在本函数
def func():
a = 1
_b = 2
__c = 3
print(a, _b, __c)
def func2():
_b = 5
__c = 6
print(_b, __c)
func2()
func() # 1 2 3 5 6
a = 2
func() # 1 2 3 5 6
_b = 2
func() # 1 2 3 5 6
类的局部变量可以访问,不可以修改:
类的受保护变量可以访问,不可以修改
类的私有变量不可以访问,要访问则加上 a._A__sex 格式,不可以修改
class A:
name = 'wang'
_age = 22
__sex = 'men'
a = A()
print(a.name) # wang
a.name = 'liu' # 其实就是定义了一个新变量a.name,赋值为 'liu'
print(a.name) # liu
print(A.name) # wang
print(a._age) # 22
# print(a.__sex) # 报错没有属性 'A' object has no attribute '__sex'
print(a._A__sex)# 'men' a._A__sex 可以得到类的私有变量
def func():
x = 1
y = 2
def sums(x, y):
print(x, y)
sums(x, y)
func() # 1 2
1.内部函数可以使用外部函数的变量
2.局部的global不能改变全局的变量
3.nonlocal(只能用于局部变量):声明了上层局部变量,只能找最近上一层的变量,若上层没有就找上上层但不会找到全局中。