类 Class

#先定义类,后产生对象
#调用类会产生对象,返回的是对象

注意:类体代码是在类定义阶段就会立即执行,会产生类的名称空间

class People:
	def __init__(obj, x, y, z):
		obj.name = x
		obj.age = y
		obj.sex = z

obj1=People('peng',18,'male')     # 调用类的时候会实例化一个对象,并自动执行__init__ 方法



# 调用类的过程又称之为实例化,发生了三件事
# 1、先产生一个空对象
# 2、python会自动调用类中的__init__方法然将空对象已经调用类时括号内传入的参数一同传给__init__方法
# 3、返回初始完的对象




# __init__方法
# 强调:
#   1、会在调用类时自动触发执行,用来为对象初始化自己独有的数据
#   2、__init__内应该存放是为对象初始化属性的功能,但是是可以存放任意其他代码,想要在类调用时就立刻执行的代码都可以放到该方法内
#   2、一定不能自定义返回值 一定是返回None

#python为类内置的特殊属性
类名.__name__# 类的名字(字符串)
类名.__doc__# 类的文档字符串
类名.__base__# 类的第一个父类(在讲继承时会讲)
类名.__bases__# 类所有父类构成的元组(在讲继承时会讲)
类名.__dict__# 类的字典属性
类名.__module__# 类定义所在的模块
类名.__class__# 实例对应的类(仅新式类中)

类中存放的是对象共有的数据与功能

# 一:类可以访问:
# 1、类的数据属性
# 2、类的函数属性

类中的东西是给对象用的

# 1、类的数据属性是共享给所有对象用的,大家访问的地址都是一样的,绑定给对象后也是一样的,但修改绑定对象的属性时会在对象内单独创建新属性。
# 2、类中定义的方法是绑定给对象使用的,类方法绑定对象后称之为绑定方法,各个对象的绑定方法内存地址各不相同,与类方法地址也不同。

	# 类调用自己的方法属性必须严格按照函数的用法来,方法本质就是函数
	# 绑定方法的特殊之处在于:谁来调用绑定方法就会将谁当做第一个参数自动传入self

封装

封装是面向对象三大特性最核心的一个特性 ----------封装<->整合

将封装的属性进行隐藏操作

1、如何隐藏:在属性名前加__前缀,就会实现一个对外隐藏属性效果
该隐藏需要注意的问题:

I:在类外部无法直接访问双下滑线开头的属性,但知道了类名和属性名就可以拼出名字:_类名__属性,然后就可以访问了,如Foo._A__N,所以说这种操作并没有严格意义上地限制外部访问,仅仅只是一种语法意义上的变形。
II:这种隐藏对外不对内,因为__开头的属性会在检查类体代码语法时统一发生变形
III: 这种变形操作只在检查类体语法的时候发生一次,之后定义的__开头的属性都不会变形

class Foo:
	__x = 1  # _Foo__x = 1

	def __init__(self,name,age):
		self.__name=name
		self.__age=age

obj=Foo('egon',18)
print(obj.__dict__)
print(obj.name,obj.age)
2、为何要隐藏?

I、隐藏数据属性"将数据隐藏起来就限制了类外部对数据的直接操作,然后类内应该提供相应的接口来允许类外部间接地操作数据,接口之上可以附加额外的逻辑来对数据的操作进行严格地控制:
II、隐藏函数/方法属性:目的的是为了隔离复杂度