Python类和函数(私有变量、私有方法、变量作用域、继承和多态)

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(只能用于局部变量):声明了上层局部变量,只能找最近上一层的变量,若上层没有就找上上层但不会找到全局中。

猜你喜欢

转载自blog.csdn.net/weixin_42563968/article/details/108549432