Python类及常见的方法属性定义
Python是一门完全面向对象(OOP)的语言,对于Python来说,一切皆对象,
一切皆对象,
猫,老虎,狗,狼这些都是我们认识的一种动物,在现实生活中我们把它叫做动物,而在面向对象的编程语言(OOP)中我们称这类在生活中的具体事物叫做对象,既然提到对象我们就不得不说一下类,什么是类那,打个比方,就好动物学家通过动物的共同点,把动物进行分类,猫和老虎被分到了猫科,狗和狼被分到了犬科,猫科,犬科实际上就是一种类,因为他们具备了猫和老虎的共同点,所以你就可以把类理解为事物共同点的抽象
不过在现实生活我们是通过对象去认识类的,而在编程语言中我们把他进行了反转,是通过类去认识对象,
对象和类
对象就是类的实例化,类就是对象的具体抽象
面向对象的三大特征
封装(encapsulation)
继承(inheritance)
多态(polymorphism)
开发的过程:其实就是不断的创建对象,使用对象,指挥对象做事情。
设计的过程:其实就是在管理和维护对象之间的关系.
在Python中的类
定义类
定义一个简单的person类,在这个类里没有定义任何方法
创建类
在上面我们定义了一个类,下面我们就用这个类创建一个实例对象P
定义一个带方法的类
创建一个类调用方法
定义一个带有各种常用变量,方法类型的类
class Person(object):
'''
起到限制作用,表示在类中只能有这三个属性,不可以在动态或静态的添加对该类的实例添加属性
注意在使用__slots__限制变量时,如果加入类变量的名称不发生错误,如下
错误写法:
__slots__ = ("_id", "name","__age","address")
'''
__slots__ = ("_id", "name", "__age")
address = "我是一个类变量,可以被类名直接调用"
def __new__(cls, *args, **kwargs):
print("创建类时调用")
return object.__new__(cls)
def __init__(self):
self.name = "我是一个全局变量,在任何地方都可以调用"
self._id = "我只可以在本模块里被调用"
self.__age = "我是一个私有变量,只能在本类里调用不能再外部调用"
print("初始化实例变量时被调用")
def test(self):
print("我是一个实例方法只有对象被创建才可以被对象调用")
def __testPri(self):
print("我是一个私有方法,不可以被外不调用")
@staticmethod
deftestStatic(self):
print("我是一个静态方法可以直接用类名被调用")
@classmethod
def testCls(cls):
print("我是一个类方法可以直接用类名被调用")
def __del__(self):
print("类被销毁时调用")
def __str__(self):
print("返回对类的描述")
return "我是%s"%self.__class__.__name__
def __call__(self, *args, **kwargs):
print("类被当做函数使用时调用")
各种变量,内置方法浅解
__new__
1, __new__方法只能在继承了object的新式类中使用,在object类中将__new__方法定义为静态方法,至少需要传递一个参数cls,cls表示需要实例化的类对象,
此方法在你实例化对象时自动调用,cls参数也由Python解释器自动提供。
2, 复写__new__
必须时要有返回值,返回实例化出来的实例对象,可以return返回父类__new__
出来的实例,或者直接是object的__new__
出来的实例都可以,上文是直接调用object的__new__方法
3,__new__()是唯一在实例创建之前执行的方法,一般用在定义元类时使用
__init__
1,__init__方法由Python解释器自动调用,在调用时会自动传入一个本类的实例变量
2,__init__方法是在__new__之后调用的,因为Python解释器需要__new__返回的实例对象,作为参数传入__init__方法
3,__init__主要用于初始化本对象的实例变量或初始化父类的实例变量
初始化父类的实例变量如下:
superName.__init__(self)
super(superName, self).__init() #新式类中使用
4, __init__不需要返回值
__del__
1,__init__方法由Python解释器自动调用,在调用时会自动传入一个本类的实例变量
2,__del__是在python删除一个对象时有Python自动调用的,
那什么时候,会让Python内存管理机制认为他是需要删除的那,当他的引用计数器为零,也就是没有没有任何引用时Python会认为他需要被释放,然后调用__del__方法
查看一个对象的引用计数
importsys
sys.getrefcount(object )
__str__
1,此方法的作用,是描述一个类描述,如果没有重写会直接返回一个类的
<__main__.类名 父类at 存储地址>
<__main__.Person object at0x000001231DE6FF48>
__call__
如果重写类这个方法,就可以把这个类型的对象当做函数来用,相当于重载了括号运算符,
在类装饰器会用到
私有化实例变量
1,设置类的属性为__,不能使用对象名.属性名的方式直接访问对象的属性。就好像java的private一样,可以达到封装的目的,
那我们我怎么对该属性设置值和访问那
1:对外提供公开的用于设置对象属性的public方法
1:设置set
2:获取get
2:在set方法中加入逻辑判断,过滤掉非法数据。
3:将所有的成员变量封装加上__,提供get、set方法,
Ps:其实在python中的,类的私有化是通过改变属性名实现的,修改规则如下:
_类名__属性名
调用使用被Python修改过得私有属性
打印结果
2,私有化属性也是实例属性,Python每创建一个实例对象,就会在内存空间中开辟一处内存,每处内存空间都有实例属性,他们不会相互影响,也就是说你修改一个对象的实例属性,另一个同类对象的同名属性不会受到影响,是相对独立
单下划线变量
_xx以单下划线开头的表示的是protected类型的变量。即保护类型只能允许其本身与子类进行访问。若内部变量标示,如: 当使用“from M import”时,不会将以一个下划线开头的对象引入
类属性
1,类属性是指,那些定义在类里,方法之外的属性
2,类属性,不随实例对象的创建而创建,无论你使用该类创建多少个实例对象,类属性只存在一个
3,类属性就是类对象拥有的属性,他被类对象的所有实例对象所共有,可用于实例对象间的数据共享,不可以用self.类属性,因为self代表当前调用者对象,
4,使用类属性时 需要用 类名.类属性名或 类对象的实例对象.类属性名访问,,如果要修改值时,需要用 类名.类属性名 = “xxx” 去修改,不可以用 类对象的实例对象.类属性名,
如果使用 类对象的实例对象.类属性名 修改,则相当于为该对象添加了一个实例属性,
静态方法
1,静态方法要使用@staticmethod修饰,要不然就是实例方法
2,静态方法可以不写参数,但如果这样就不能调用当用实例属性
3,在无参静态方法里不可以调用实例属性,self,super,因为静态方法是先于实例对象存在的,
4,要想在静态方法里调用实例方法,可以在静态方法中写上参数,把当前实例对象当做实参传给静态方法,这样就可以间接的调用静态方法
如下
类方法
1,类方法是类对象的方法,只有一个
2,类方法要使用@classmethod修饰,要不然就是实例方法
3,类方法的第一个参数是类对象,由Python自动传入,
4,在类方法里不可以调用实例属性,self,super,因为类方法是先于实例对象存在的,
私有方法
1,在Python中私有方法通过前面加两个下划线来定义 如:def __xx(self):
2,只有该类对象的实例对象可以访问子类已不可访问,不可以在外部调用,
创建对象的调用顺序
1, 先调用__new__方法,由此方法返回一个实例对象给调用者(Python解释器)
2,调用者(Python解释器)在把刚刚创建的 实例对象 作为实参传递并调用__init__方法,完成初始化
3,并返回实例对象的引用