Python类及常见的方法属性定义

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__方法定义为静态方法,至少需要传递一个参数clscls表示需要实例化的类对象,

此方法在你实例化对象时自动调用,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,设置类的属性为__,不能使用对象名.属性名的方式直接访问对象的属性。就好像javaprivate一样,可以达到封装的目的,

那我们我怎么对该属性设置值和访问那

1:对外提供公开的用于设置对象属性的public方法

                1:设置set

                2:获取get

   2:在set方法中加入逻辑判断,过滤掉非法数据。

   3:将所有的成员变量封装加上__,提供getset方法,

 

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,并返回实例对象的引用














     




 



 




 



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值