python面向对象,零基础分分钟通晓python面向对象那么些事您也行

① 、面向对象

Python之面向对象总括,python面向对象

① 、面向对象

   ① 、面向进程

     
 a、优点:十分大的下落了写程序的复杂度,只须求顺着执行的步调,堆叠代码即可

     
 b、缺点:一套流水生产线恐怕流程正是来化解一个题材,代码就是牵一发而南京全身

   ② 、面向对象

     
 a、优点:消除程序的扩张性,对某二个目标单独修改,会立即反应到整个系统中

     
 b、缺点:可控性差,无法向面向进度的顺序设计流水生产线式的能够很精准的展望难点的拍卖流程与结果,面向对象的主次一旦早先就有对象时期的并行化解难题。

   叁 、 类:具有相同特征的一类东西(人、狗、老虎)

   四 、对象/实例:具体的某二个事物(隔壁阿花、楼下旺财)

   5、实例化:类——>对象的进度

   六 、在python中,用变量表示特征,用函数表示技术,因此具有相同特征和技术的一类东西正是‘类’,

   ⑦ 、对象是则是这一类东西中实际的八个

class Person:   #定义一个人类
    role = 'person'  #人的角色属性都是人
    def walk(self):  #人都可以走路,也就是有一个走路方法,也叫动态属性
        print("person is walking...")

class 类名:
    类属性 = None
    def __init__(self,对象属性):
        self.对象属性 = 对象属性

    def 方法名(self):
        pass

实例 = 类名(10)
实例.方法名()

    八 、类的两种效应:属性引用和实例化

    ⑨ 、属性引用(类名.属性)

class Person:   #定义一个人类
    role = 'person'  #人的角色属性都是人
    def walk(self):  #人都可以走路,也就是有一个走路方法
        print("person is walking...")


print(Person.role)  #查看人的role属性
print(Person.walk)  #引用人的走路方法,注意,这里不是在调用

   
十 、例化:类名加括号便是实例化,会自动触发__init__函数的运作,能够用它来为各样实例定制本人的性子

class Person:   #定义一个人类
    role = 'person'  #人的角色属性都是人
    def __init__(self,name):
        self.name = name  # 每一个角色都有自己的昵称;

    def walk(self):  #人都可以走路,也就是有一个走路方法
        print("person is walking...")


print(Person.role)  #查看人的role属性
print(Person.walk)  #引用人的走路方法,注意,这里不是在调用

    11、

类名
    类名.类属性
   类名.方法名

实例 = 类名(参数,参数)  #实例就是对象

实例
    实例.方法名()
   实例.对象属性

实例增加属性
实例.新的属性名 = 1000
print(实例.新的属性名)

   12、关于self

self:在实例化时自动将对象/实例本身传给__init__的第一个参数,你也可以给他起个别的名字.

对象/实例只有一种作用:属性引用

class 类名:
    def __init__(self,参数1,参数2):
        self.对象的属性1 = 参数1
        self.对象的属性2 = 参数2

    def 方法名(self):pass

    def 方法名2(self):pass

对象名 = 类名(1,2)  #对象就是实例,代表一个具体的东西
                  #类名() : 类名+括号就是实例化一个类,相当于调用了__init__方法
                  #括号里传参数,参数不需要传self,其他与init中的形参一一对应
                  #结果返回一个对象
对象名.对象的属性1   #查看对象的属性,直接用 对象名.属性名 即可
对象名.方法名()     #调用类中的方法,直接用 对象名.方法名() 即可

dir(类) #返回类中的所有名字列表
isinstance(对象,类) #判断对象是否为类的实例
print(Person.__dict__) # 返回一个字典 key是属性名,value是属性值
print(Person.__module__)  #person类所在的模块
print(Person.__name__,type(Person.__name__)) #字符串数据类型的类名

     1③ 、类命名空间与对象、实例的命名空间

         
 a、常见二个类就会创制3个类的名号空间,用来储存类中定义的具知名字,那几个名字成为类的品质

           b、而类有三种属性:静态属性和动态属性

  •  静态属性正是一向在类中定义的变量
  • 动态属性正是概念在类中的方法

开创1个目的/实例就会创制2个对象/实例的称呼空间,存放对象/实例的名字,称为对象/实例的天性

外貌对象的咬合用法:

组合指的是,在3个类中以别的3个类的靶子作为数据属性,称为类的组

列子:

亚洲必赢官网 1

from  math  import pi
class Circular:
    def __init__(self,radius):
        self.radius=radius
    def area(self):
        return self.radius **2 * pi
    def perimeter(self):
        return 2 * self.radius * pi
circu=Circular(10)
print(circu.area())
print(circu.perimeter())

圆的周长与面积

     1④ 、面向对象的三大特点

           a、继承

class Animal:      #父类  基类  超类
    def __init__(self,name,life_value,aggr):
        self.name = name
        self.life_value = life_value
        self.aggr = aggr


class Person(Animal):  #子类  派生类
    pass

class Dog(Animal): #子类  派生类
    pass

egg = Person('egon',1000,50)
print(egg.name)
print(egg.aggr

       

python2
class Dad:  #经典类
class Dag(object)  #新式类

python3
class Dad  ==  class Dag(object) #新式类

              ① 、继承的语法

 class 类名(父类名):
      想在子类中实现调用父类的方法
      在类内 ——super(子类名,self).方法名()
      在类外面 ——super(子类名,对象名).方法名()
      如果不指定继承的父类,默认继承object
      子类可以使用父类的所有属性和方法
      如果子类有自己的方法就执行自己的的
      如果是子类没有的方法就执行父类的
      如果子类父类都没有这个方法就报错

继承、抽象、派生
继承 是从大范围到小范围
抽象 小范围到大范围
派生 就是在父类的基础上又产生子类——派生类
        父类里没有的 但子类有的 ——派生方法
        派生属性
方法的重写
    父类里有的方法,在子类里重新实现

 

              贰 、继承的三种用途:                

                 
b:继承基类的格局,并且做出自身的更动只怕扩大(代码重用)***
  ***

                 
a:评释某些子类包容于某基类,定义三个接口类Interface,接口类中定义

                       
 **
 了部分接口名(就是函数名)且尚未达成接口的功用,子类继承接口类,并且达成接口中的效能**

           b、封装

                  1、优点:

                              a、将转移隔开

                              b、封装使用

                              c、提升复用性

                              d、提升安全性

                  二 、封装原则:

                              a、将不必要对外提供的剧情都躲藏起来

                              b、把品质都躲藏起来提供公共艺术对其访问

                  ③ 、私有变量和个体方法

                             
a、在python中用双写道的起来的的主意降属性隐藏起来(设置个人的)

property属性

property是一种尤其的属性,访问它时会执行一段成效(函数)然后再次来到值

  

         
 c、多态:”多态指的是一类东西有八种样子(比如:老师.下课铃响了(),学生.下课铃响了(),老师执行的是下班操作,学生实施的是放学操作,纵然双方信息无差别于,不过实施的意义不一致)

                   多态指的是:一类东西有各个场合

python自带多态:

  多态:同一类事物的多种状态

  python里处处都是多态,只是我们一般发现不了

  操作的时候不需要关心这个对象的数据类型,你只要用就行了

 

    15、反射     

        1、反射:可以用字符串的主意去拜访对象的天性,调用对象的法门(但是不可能去拜谒方法),python中全方位皆对象,都能够选拔反射。

        贰 、反射有多种艺术:

             
 hasattr:hasattr(object,name)判断三个对象是或不是有name属性或然name方法。有就回来True,没有就回去False

             
getattr:获取对象的性质或然措施,即使存在则打印出来。hasattr和getattr配套使用

                
必要注意的是,倘诺回去的是目的的办法,重返出来的是指标的内部存款和储蓄器地址,要是急需周转这么些办法,能够在背后添加一对()

               setattr:给目的的天性赋值,若属性不设有,先创建后赋值

               delattr:删除该对象钦定的三个属性

          a、内置方法:isinstance和issubclass

               isinstance(obj,cls)检查是或不是obj是不是是类 cls
的对象

class Foo:
    pass
class Son(Foo):
    pass
s=Son()

print(isinstance(s,Son))

        b、内置方法:issubclass(sub, super)检查sub类是或不是是
super 类的派生类 

class Foo(object):
    pass

class Bar(Foo):
    pass

issubclass(Bar, Foo)

 

     
 c、python面向对象中的反射:通过字符串的款型操作对象相关的性质,python中全体育赛事物都是指标(都能够用反射)

检查是否含有某属性---hasattr 返回布尔值
获取属性---getattr   没有就会报错
设置属性---setattr
删除属性---delattr

       d、内置方法:__del__

析构方法,当目的在内部存款和储蓄器中被保释时,自动触发执行。

注:此方式一般不要定义,因为Python是一门高级语言,程序员在运用时无需关心内部存款和储蓄器的分配和刑满释放,因为此干活都以交由Python解释器来实施,所以,析构函数的调用是由解释器在举办垃圾回收时自动触发执行的。

class Foo:
    def __del__(self):
        print('fgs')
f=Foo()
print(123)
print(123)
del f
print(123)
print(123)
print(123)

 

     e、内置方法:item系列

亚洲必赢官网 2

一,.接口类

   一 、面向进度

__getitem__\__setitem__\__delitem__

    __new__

class A:
    def __init__(self):  #有一个方法在帮你创造self
        print('in init function')
        self.x=1
    def __new__(cls, *args, **kwargs):
        print('in init funct')
        return object.__new__(A,*args,**kwargs)
a=A()

     f、__str__和__python面向对象,零基础分分钟通晓python面向对象那么些事您也行。repr__变更指标的字符串展现

亚洲必赢官网 3

class Foo:
 2     def __init__(self,name):
 3         self.name = name
 4     def __repr__(self):
 5         return 'obj in str'  #这里只能是return
 6     # def __str__(self):
 7     #     return '%s obj in str'%self.name
 8 f = Foo('egon')
 9 print(f)  #优先执行__str__里面的内容
10 # 那么你是不是据地__repr__没用呢?
11 # print('%s'%f)  #执行的是__str__里面的返回值
12 # print('%r'%f)  #执行的是__repr__里面的返回值
13 print('==============')
14 print(str(f))  #当执行str(f)时,会去找__str__这个方法,如果找不到的时候,__repr__这个方法就给替补了
15 print(repr(f))
16 #1.当打印一个对象的时候,如果实现了__str__方法,打印__str__中的返回值
17 # 2.当__str__没有被实现的时候,就会调用__repr__方法
18 # 3.但是当你用字符串格式化的时候,%s和%r会分别调用__str__和__repr__方法
19 # 4.不管是在字符串格式化的时候还是在打印对象的时候,
20 # __repr__方法都可以作为__str__方法的替补,但反之则不行
21 # 5.用于友好的表示对象。如果__str__和__repr__方法你只能实现一个:先实现__repr__

__str__,__repr__

    1五 、内置方法

           a、静态方法和类措施

             
 ① 、类情势:有个暗中同意参数cls,并且能够间接用类名去调用,能够与类属性交互(约等于足以选取类属性)

             
 ② 、静态方法:让类里的法门直接被类调用,就好像正规调用函数一样

           b、类措施和静态方法的相同点:都足以一贯被类调用,不需求实例化

           c、类措施和静态方法的分歧点:

          类方法必须有2个cls参数表示这些类,能够动用类属性

           静态方法不须求参数

           d、绑定方法:分为一般方法和类格局

     普通方法:暗中同意有三个self对象传进来,并且不得不被对象调用——-绑定到指标

     类方法:默许有1个cls对象传进来,并且能够被类和指标(不引进)调用—–绑定到类

           
e、非绑定方法:静态方法:没有设置私下认可参数,并且能够被类和对象(不引进)调用—–非绑定

    1⑥ 、接口类与抽象类

             a、 接口类:(在抽象类的基础上)

         在python中,私下认可是没有接口类的           

                    接口类不能够被实例化(借使实例化会报错)

          接口类中的方法不可能被完成

接口也就是做约束,让下面的类的方法都按照接口类中给出的方法去定义。如果接口类里面有的方法类里面没有,那么那个类就不能被实例化。(字面理解)

继承的第二种含义非常重要。它又叫“接口继承”。
接口继承实质上是要求“做出一个良好的抽象,这个抽象规定了一个兼容接口,使得外部调用者无需关心具体细节,可一视同仁的处理实现了特定接口的所有对象”——这在程序设计上,叫做归一化。

           b、抽象类

在python中,默认是有的

    父类的方法,子类必须实现

    抽象类(父类)的方法可以被实现

抽象类和接口类的区别:接口类不能实现方法,抽象类可以实现方法里面的内容

抽象类和接口类的相同点:都是用来做约束的,都不能被实例化

抽象类和接口类的使用:

  当几个子类的父类有相同的功能需要被实现的时候就用抽象类

  当几个子类有相同的功能,但是实现各不相同的时候就用接口类

 

① 、面向对象
① 、面向进度a、优点:非常大的狂跌了写程序的复杂度,只要求顺着执行的手续,堆叠代…

壹 、面向对象

  1. 后续有二种用途  

     
 a、优点:极大的暴跌了写程序的复杂度,只供给顺着执行的步骤,堆叠代码即可

一 、面向进程

  1>:继承基类的方法,并且做出自个儿的变更依旧扩张(代码重用)  

     
 b、缺点:一套流水生产线只怕流程正是来化解1个标题,代码正是牵一发而苏州全身

a、优点:十分大的回落了写程序的复杂度,只必要顺着执行的步子,堆叠代码即可

  2>:注脚有些子类包容于某基类,定义二个接口类Interface,接口类中定义了部分接口

   贰 、面向对象

b、缺点:一套流水生产线大概流程正是来消除一个标题,代码正是牵一发而郑州全身

     
名(正是函数名)且并未完结接口的坚守,子类继承接口类,并且达成接口中的功效

     
 a、优点:解决程序的扩充性,对某1个对象单独修改,会及时反应到全方位连串中

② 、面向对象

 

     
 b、缺点:可控性差,无法向面向进度的次第设计流水生产线式的能够很精准的预测难题的拍卖流程与结果,面向对象的顺序一旦伊始就有对象时期的互相消除难点。

a、优点:化解程序的扩张性,对某一个对象单独修改,会即时反应到全数体系中

# 一:这样不好,我要统一一下支付的规则.

class QQpay:
    def pay(self,money):
        print('使用qq支付%s元' % money)

class Alipay:
    def pay(self,money):
        print('使用阿里支付%s元' % money)

a = Alipay()
a.pay(100)

b = QQpay()
b.pay(200)


# 二,统一支付的规则 归一化设计,统一 pay接口
class QQpay:
    def pay(self,money):
        print('使用qq支付%s元' % money)

class Alipay:
    def pay(self,money):
        print('使用阿里支付%s元' % money)

def pay(obj,money):        
    obj.pay(money)        #统一调用上面类中pay方法,

a = Alipay()
b = QQpay()

pay(a,100)
pay(b,200)


# 三,但是,来了一个野生程序员,他不知道你的约定俗成的规则,就会出问题

class QQpay:
    def pay(self,money):
        print('使用qq支付%s元' % money)

class Alipay:
    def pay(self,money):
        print('使用阿里支付%s元' % money)

class Wechatpay:
    def fuqian(self,money):
        print('使用微信支付%s元' % money)

def pay(obj,money):
    obj.pay(money)

a = Alipay()
b = QQpay()

pay(a,100)
pay(b,200)

c = Wechatpay()
c.fuqian(300)


# 四,解决方式
# 定义一个父类,什么都不写,只是要求继承我的所有类有一个pay方法,这样就制定了一个规范,这就叫做接口类,后者抽象类.
class Payment:
    def pay(self):pass

class QQpay(Payment):
    def pay(self,money):
        print('使用qq支付%s元' % money)

class Alipay(Payment):
    def pay(self,money):
        print('使用阿里支付%s元' % money)

class Wechatpay(Payment):
    def fuqian(self,money):
        print('使用微信支付%s元' % money)


def pay(obj,money):
    obj.pay(money)

a = Alipay()
b = QQpay()

pay(a,100)
pay(b,200)

c = Wechatpay()
c.fuqian(300)

#五,他还是不知道看你这些都继承了一个类,所以你要制定一个规范,强制他执行.
# 创建一个规范
from abc import ABCMeta,abstractmethod
class Payment(metaclass=ABCMeta):    # 抽象类 接口类  规范和约束  metaclass指定的是一个元类
    @abstractmethod
    def pay(self):pass  # 抽象方法

class Alipay(Payment):
    def pay(self,money):
        print('使用支付宝支付了%s元'%money)

class QQpay(Payment):
    def pay(self,money):
        print('使用qq支付了%s元'%money)

class Wechatpay(Payment):
    # def pay(self,money):
    #     print('使用微信支付了%s元'%money)
    def recharge(self):pass

def pay(a,money):
    a.pay(money)

a = Alipay()
a.pay(100)
pay(a,100)    # 归一化设计:不管是哪一个类的对象,都调用同一个函数去完成相似的功能
q = QQpay()
q.pay(100)
pay(q,100)
w = Wechatpay()
pay(w,100)   # 到用的时候才会报错



# 抽象类和接口类做的事情 :建立规范
# 制定一个类的metaclass是ABCMeta,
# 那么这个类就变成了一个抽象类(接口类)
# 这个类的主要功能就是建立一个规范    

   三 、 类:具有相同特征的一类东西(人、狗、老虎)

b、缺点:可控性差,不能够向面向进程的主次设计流水生产线式的能够很精准的预测难题的拍卖流程与结果,面向对象的次第①旦初步就有目的期间的互相消除难题。

  

   四 、对象/实例:具体的某二个东西(隔壁阿花、楼下旺财)

③ 、 类:具有相同特征的一类东西(人、狗、老虎)

  2.
进行中,继承的率先种意义意义并不非常的大,甚至平时是损害的。因为它使得子类与基

   伍 、实例化:类——>对象的进程

肆 、对象/实例:具体的某二个事物(隔壁阿花、楼下旺财)

   类现身强耦合。

   陆 、在python中,用变量表示特征,用函数表示技术,由此具有相同特征和技艺的一类东西就是‘类’,

⑤ 、实例化:类——>对象的长河

     1>  继承的第几种意义卓殊重庆大学。它又叫“接口继承”。
    
 接口继承实质上是必要“做出二个上佳的抽象,那些抽象规定了2个男才女貌接口,使得外

   七 、对象是则是这一类东西中具体的三个

陆 、在python中,用变量表示特征,用函数表示技术,由此具有同等特征和技术的一类东西正是‘类’,

   部调用者无需关怀具体细节,可并排的拍卖达成了一定接口的富有目的”——那在

class Person:   #定义一个人类
    role = 'person'  #人的角色属性都是人
    def walk(self):  #人都可以走路,也就是有一个走路方法,也叫动态属性
        print("person is walking...")

class 类名:
    类属性 = None
    def __init__(self,对象属性):
        self.对象属性 = 对象属性

    def 方法名(self):
        pass

实例 = 类名(10)
实例.方法名()

柒 、对象是则是这一类东西中实际的1个

   程序设计上,叫做归一化。

    ⑧ 、类的二种功能:属性引用和实例化

class Person: #概念一个生人

   归一化使得高层的表面使用者能够不加区分的拍卖全数接口包容的目的集合——就好

    玖 、属性引用(类名.属性)

role = ‘person’ #人的剧中人物属性都以人

   象linux的泛文件概念一样,全部东西都能够当文件处理,不必关注它是内部存款和储蓄器、磁盘、

class Person:   #定义一个人类
    role = 'person'  #人的角色属性都是人
    def walk(self):  #人都可以走路,也就是有一个走路方法
        print("person is walking...")


print(Person.role)  #查看人的role属性
print(Person.walk)  #引用人的走路方法,注意,这里不是在调用

def walk(self): #人都得以走路,也便是有2个步履方法,也叫动态属性

   网络只怕荧屏(当然,对底层设计者,当然也能够区分出“字符设备”和“块设备”,然后

   
⑩ 、例化:类名加括号就是实例化,会活动触发__init__函数的运作,能够用它来为各种实例定制自个儿的特点

print(“person is walking…”)

   做出针对性的设计:细致到哪些水平,视要求而定)。

class Person:   #定义一个人类
    role = 'person'  #人的角色属性都是人
    def __init__(self,name):
        self.name = name  # 每一个角色都有自己的昵称;

    def walk(self):  #人都可以走路,也就是有一个走路方法
        print("person is walking...")


print(Person.role)  #查看人的role属性
print(Person.walk)  #引用人的走路方法,注意,这里不是在调用

class 类名:

 

    11、

类属性 = None def __init__(self,对象属性):

   2>
注意:在python中一向就从未有过2个号称interface的首要性字,上边的代码只是看起来像

类名
    类名.类属性
   类名.方法名

实例 = 类名(参数,参数)  #实例就是对象

实例
    实例.方法名()
   实例.对象属性

实例增加属性
实例.新的属性名 = 1000
print(实例.新的属性名)

self.对象属性 = 对象属性 def 方法名(self): pass实例 = 类名(10)

      接口,其实并没有起到接口的功用,子类完全可以不用去完结接口 

   12、关于self

实例.方法名()

 

self:在实例化时自动将对象/实例本身传给__init__的第一个参数,你也可以给他起个别的名字.

对象/实例只有一种作用:属性引用

class 类名:
    def __init__(self,参数1,参数2):
        self.对象的属性1 = 参数1
        self.对象的属性2 = 参数2

    def 方法名(self):pass

    def 方法名2(self):pass

对象名 = 类名(1,2)  #对象就是实例,代表一个具体的东西
                  #类名() : 类名+括号就是实例化一个类,相当于调用了__init__方法
                  #括号里传参数,参数不需要传self,其他与init中的形参一一对应
                  #结果返回一个对象
对象名.对象的属性1   #查看对象的属性,直接用 对象名.属性名 即可
对象名.方法名()     #调用类中的方法,直接用 对象名.方法名() 即可

dir(类) #返回类中的所有名字列表
isinstance(对象,类) #判断对象是否为类的实例
print(Person.__dict__) # 返回一个字典 key是属性名,value是属性值
print(Person.__module__)  #person类所在的模块
print(Person.__name__,type(Person.__name__)) #字符串数据类型的类名

亚洲必赢官网 4

   3>
 接口提取了一群类一起的函数,能够把接口当做多少个函数的聚合。
然后让子

     1三 、类命名空间与目的、实例的命名空间

八 、类的三种意义:属性引用和实例化

    类去落到实处接口中的函数。
这么做的意义在于归一化,什么叫归一化,正是只

         
 a、常见1个类就会创设1个类的名号空间,用来储存类中定义的有所名字,那么些名字成为类的特性

九 、属性引用(类名.属性)

    假如基于同一个接口完毕的类,那么全部的那一个类爆发的目的在运用时,从用

           b、而类有三种属性:静态属性和动态属性

class Person: #概念七个生人

    法上的话都同一。
归一化,让使用者无需关切对象的类是何许,只需求的驾驭

  •  静态属性正是直接在类中定义的变量
  • 动态属性正是概念在类中的方法

role = ‘person’ #人的角色属性都是人

    这个指标都怀有有些意义就能够了,那巨大地降低了使用者的应用难度。

始建2个对象/实例就会创制2个对象/实例的称谓空间,存放对象/实例的名字,称为对象/实例的性质

def walk(self): #人都足以走路,也便是有贰个行动方法

    如:大家定义1个动物接口,接口里定义了有跑、吃、呼吸等接口函数,那样老

长相对象的组成用法:

print(“person is walking…”)print(Person.role)
#查看人的role属性print(Person.walk)
#引用人的行进方法,注意,那里不是在调用。作者推荐2个学Python的上学裙【五八八,零九零,九四二】,无论你是大腕依旧小白,是想转行还是想入行都得以来打探一起前行一起学习!裙内有无数干货和技艺分享

    鼠的类去贯彻了该接口,松鼠的类也去贯彻了该接口,由双方分别发出贰只老鼠

组成指的是,在三个类中以别的三个类的对象作为数据属性,称为类的组

十 、例化:类名加括号就是实例化,会活动触发__init__函数的运作,能够用它来为各样实例定制本身的风味

    和壹只松鼠送到你方今,即就是您分别不到底哪只是什么样鼠你势必精通他们都会

列子:

class Person: #概念一个人类

    跑,都会吃,都能呼吸。
再比如:大家有3个汽车接口,里面定义了汽车具备

亚洲必赢官网 5亚洲必赢官网 6

role = ‘person’ #人的剧中人物属性都以人

    的效应,然后由本田(Honda)小车的类,奥迪(奥迪)小车的类,斯巴鲁小车的类,他们都落到实处了汽

from  math  import pi
class Circular:
    def __init__(self,radius):
        self.radius=radius
    def area(self):
        return self.radius **2 * pi
    def perimeter(self):
        return 2 * self.radius * pi
circu=Circular(10)
print(circu.area())
print(circu.perimeter())

def __init__(self,name):

    车接口,那样就好办了,大家只要求学会了怎么开汽车,那么不论本田(Honda),还是

圆的周长与面积

self.name = name # 每二个角色都有和好的小名;

    奥迪(奥迪(Audi)),依然PEUGEOT大家都会开了,开的时候根本无需关切小编开的是哪类车,操作

     14、面向对象的三大特征

def walk(self): #人都足以走路,约等于有三个行动方法

    手法(函数调用)都一模一样

           a、继承

print(“person is walking…”)print(Person.role)
#查看人的role属性print(Person.walk)
#引用人的行路方法,注意,那里不是在调用

 

class Animal:      #父类  基类  超类
    def __init__(self,name,life_value,aggr):
        self.name = name
        self.life_value = life_value
        self.aggr = aggr


class Person(Animal):  #子类  派生类
    pass

class Dog(Animal): #子类  派生类
    pass

egg = Person('egon',1000,50)
print(egg.name)
print(egg.aggr

11、

二,  抽象类

       

类名

  1. 怎么样是抽象类

python2
class Dad:  #经典类
class Dag(object)  #新式类

python3
class Dad  ==  class Dag(object) #新式类

类名.类属性

*     *
与java一样,python也有抽象类的概念然而同样须求依靠模块实现,抽象类是二个越发

              一 、继承的语法

类名.方法名

   的类,它的奇特之处在于只好被持续,不能够被实例化

 class 类名(父类名):
      想在子类中实现调用父类的方法
      在类内 ——super(子类名,self).方法名()
      在类外面 ——super(子类名,对象名).方法名()
      如果不指定继承的父类,默认继承object
      子类可以使用父类的所有属性和方法
      如果子类有自己的方法就执行自己的的
      如果是子类没有的方法就执行父类的
      如果子类父类都没有这个方法就报错

继承、抽象、派生
继承 是从大范围到小范围
抽象 小范围到大范围
派生 就是在父类的基础上又产生子类——派生类
        父类里没有的 但子类有的 ——派生方法
        派生属性
方法的重写
    父类里有的方法,在子类里重新实现

 

实例 = 类名(参数,参数) #实例正是目的实例

 

              贰 、继承的二种用途:                

实例.方法名()

  2. 为啥要有抽象类

                 
b:继承基类的不二法门,并且做出本身的改观只怕扩充(代码重用)***
  ***

实例.对象属性

   如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类是从一堆中抽取相同

                 
a:证明有个别子类包容于某基类,定义2个接口类Interface,接口类中定义

实例扩充属性

   的内容而来的,内容包罗数据属性和函数属性。

                       
 **
 了有个别接口名(正是函数名)且没有完结接口的效率,子类继承接口类,并且达成接口中的功效**

实例.新的性质名 = 一千print(实例.新的属性名)

   
比如大家有香蕉的类,有苹果的类,有桃子的类,从那个类抽取相同的情节就是鲜果那

           b、封装

12、关于self

   个抽象的类,你吃水果时,要么是吃1个具体的香蕉,要么是吃贰个有血有肉的桃子,你永远

                  1、优点:

self:在实例化时自动将对象/实例本身传给__init__的首先个参数,你也能够给她起分别的名字.

   不能吃到二个称作水果的事物。

                              a、将转变隔绝

指标/实例唯有一种意义:属性引用

     
从统一筹划角度去看,假如类是从现实对象抽象而来的,那么抽象类正是依照类华而不实而来的。

                              b、封装使用

class 类名: def __init__(self,参数1,参数2):

   
从贯彻角度来看,抽象类与普通类的分歧之处在于:抽象类中有抽象方法,该类不可能被

                              c、升高复用性

self.对象的习性1 = 参数1

   实例化,只好被持续,且子类必须兑现抽象方法。这点与接口有点类似,但实则是不

                              d、进步安全性

self.对象的习性2 = 参数2 def 方法名(self):pass

   同的.

                  二 、封装原则:

def 方法名2(self):pass对象名 = 类名(1,2)
#目的便是实例,代表3个现实的东西

 

                              a、将不必要对外提供的始末都藏匿起来

#类名() : 类名+括号便是实例化贰个类,也就是调用了__init__方法

 

                              b、把品质都掩藏起来提供公共艺术对其访问

#括号里传参数,参数不要求传self,其余与init中的形参一一对应

  2. 抽象类与接口类

                  ③ 、私有变量和个人方法

#结果回到1个目的指标名.对象的属性1 #翻看对象的习性,间接用
对象名.属性名 即可对象名.方法名() #调用类中的方法,直接用
对象名.方法名() 即可

   抽象类的本质依旧类,指的是一组类的相似性,包蕴数据属性(如all_type)和函数属

                             
a、在python中用双涂鸦的启幕的的点子降属性隐藏起来(设置个人的)

亚洲必赢官网 7

   性(如read、write),而接口只强调函数属性的相似性

property属性

dir(类) #回到类中的所盛名字列表isinstance(对象,类)
#判定指标是不是为类的实例print(Person.__dict__) # 重返贰个字典
key是属性名,value是属性值print(Person.__module__)
#person类所在的模块print(Person.__name__,type(Person.__name__))
#字符串数据类型的类名

   抽象类是叁个在乎类和接口直接的3个定义,同时具备类和接口的片段本性,能够

property是一种相当的天性,访问它时会执行一段功用(函数)然后再次回到值

1三 、类命名空间与指标、实例的命名空间

   用来落实归一化设计 

  

a、常见二个类就会创制二个类的称谓空间,用来储存类中定义的具备名字,这么些名字改成类的属性

   

         
 c、多态:”多态指的是一类东西有多种形状(比如:老师.下课铃响了(),学生.下课铃响了(),老师执行的是下班操作,学生实施的是放学操作,即便两者音讯无差异于,不过执行的效益差别)

b、而类有二种属性:静态属性和动态属性

  3.
在python中,并从未接口类那种东西,即便不经过专门的模块定义接口,大家也应该有

                   多态指的是:一类玩意儿有三种动静

静态属性便是直接在类中定义的变量

   一些主干的定义。

python自带多态:

  多态:同一类事物的多种状态

  python里处处都是多态,只是我们一般发现不了

  操作的时候不需要关心这个对象的数据类型,你只要用就行了

动态属性正是概念在类中的方法

 

 

创制二个目的/实例就会创立八个对象/实例的名号空间,存放对象/实例的名字,称为对象/实例的性质

  4. 多三番五次难题

    15、反射     

外貌对象的结缘用法:

    在后续抽象类的经过中,大家理应尽量制止多三番五次;
    而在继承接口的时候,大家反而鼓励你来多再三再四接口

        壹 、反射:能够用字符串的艺术去拜谒对象的性质,调用对象的不二法门(不过无法去做客方法),python中总体皆对象,都足以运用反射。

重组指的是,在一个类中以此外3个类的对象作为数据属性,称为类的组

 
  
  5. 接口隔离原则:
  使用多个专门的接口,而不使用单一的总接口。即客户端不应该依赖那些不需要的接口。

        二 、反射有八种情势:

列子:

 

             
 hasattr:hasattr(object,name)判断2个目的是或不是有name属性大概name方法。有就回到True,没有就回到False

圆的周长与面积

  6. 方法的达成

             
getattr:获取对象的习性或然措施,假设存在则打字与印刷出来。hasattr和getattr配套使用

1④ 、面向对象的三大特点

   在抽象类中,大家得以对有的虚无方法做出基础达成;
   而在接口类中,任何措施都只是一种标准,具体的成效必要子类完结

                
须求小心的是,就算回去的是指标的法子,再次回到出来的是指标的内部存款和储蓄器地址,假使供给周转这一个方法,能够在背后添加一对()

a、继承

 

               setattr:给指标的特性赋值,若属性不设有,先成立后赋值

class Animal: #父类 基类 超类

三, 多态

               delattr:删除该对象钦赐的1特性质

def __init__(self,name,life_value,aggr):

 

          a、内置方法:isinstance和issubclass

self.name = name

  1.
Pyhon不支持Java和C#这一类强类型语言中多态的写法,不过原生多态,其Python崇尚

               isinstance(obj,cls)检查是还是不是obj是或不是是类 cls
的对象

self.life_value = life_value

   “鸭子类型”

class Foo:
    pass
class Son(Foo):
    pass
s=Son()

print(isinstance(s,Son))

self.aggr = aggrclass Person(Animal): #子类 派生类

class F1:
    pass


class S1(F1):

    def show(self):
        print 'S1.show'


class S2(F1):

    def show(self):
        print 'S2.show'


# 由于在Java或C#中定义函数参数时,必须指定参数的类型
# 为了让Func函数既可以执行S1对象的show方法,又可以执行S2对象的show方法,所以,定义了一个S1和S2类的父类
# 而实际传入的参数是:S1对象和S2对象

def Func(F1 obj):
    """Func函数需要接收一个F1类型或者F1子类的类型"""

    print obj.show()

s1_obj = S1()
Func(s1_obj) # 在Func函数中传入S1类的对象 s1_obj,执行 S1 的show方法,结果:S1.show

s2_obj = S2()
Func(s2_obj) # 在Func函数中传入Ss类的对象 ss_obj,执行 Ss 的show方法,结果:S2.show

Python伪代码实现Java或C#的多态

Python伪代码实现java C#多态

#鸭子类型

class F1:
    pass


class S1(F1):

    def show(self):
        print 'S1.show'


class S2(F1):

    def show(self):
        print 'S2.show'

def Func(obj):
    print obj.show()

s1_obj = S1()
Func(s1_obj) 

s2_obj = S2()
Func(s2_obj) 

#都有同样的方法,使用上类似,具有统一化设计思想,就叫鸭子类型

        b、内置方法:issubclass(sub, super)检查sub类是不是是
super 类的派生类 

passclass Dog(Animal): #子类 派生类

 

class Foo(object):
    pass

class Bar(Foo):
    pass

issubclass(Bar, Foo)

passegg = Person(‘egon’,1000,50)print(egg.name)print(egg.aggr

 

 

python2class Dad: #经典类class Dag(object) #新式类python3class Dad ==
class Dag(object) #新式类

四, 封装

     
 c、python面向对象中的反射:通过字符串的款型操作对象相关的性质,python中整整事物都以指标(都能够用反射)

① 、继承的语法

 

检查是否含有某属性---hasattr 返回布尔值
获取属性---getattr   没有就会报错
设置属性---setattr
删除属性---delattr

class 类名(父类名): 想在子类中贯彻调用父类的法门 在类内
——super(子类名,self).方法名() 在类外面 ——super(子类名,对象名).方法名()
如若不点名继承的父类,暗中同意继承object 子类可以选拔父类的拥有属性和方法
假若子类有投机的格局就推行本人的的 假诺是子类没有的方法就执行父类的
假设子类父类都没有这几个点子就报错

 

       d、内置方法:__del__

继承、抽象、派生

  1.
封装,顾名思义便是将内容封装到某些地方,今后再去调用被封装在某处的剧情。

析构方法,当指标在内部存款和储蓄器中被假释时,自动触发执行。

继续 是从大范围到小范围

   所以,在利用面向对象的封装性卯时,需求:

注:此情势一般不要定义,因为Python是一门高级语言,程序员在使用时无需关怀内部存款和储蓄器的分配和刑释,因为此工作都是交由Python解释器来实施,所以,析构函数的调用是由解释器在举办垃圾回收时自动触发执行的。

空洞 小范围到大范围

    •  将内容封装到某处
    •  从某处调用棉被服装进的始末
class Foo:
    def __del__(self):
        print('fgs')
f=Foo()
print(123)
print(123)
del f
print(123)
print(123)
print(123)

派生 就是在父类的底子上又发出子类——派生类

  

 

父类里不曾的 但子类有的 ——派生方法

  2. 将内容封装到某处

     e、内置方法:item系列

派生属性

亚洲必赢官网 8

__getitem__\__setitem__\__delitem__

    __new__

class A:
    def __init__(self):  #有一个方法在帮你创造self
        print('in init function')
        self.x=1
    def __new__(cls, *args, **kwargs):
        print('in init funct')
        return object.__new__(A,*args,**kwargs)
a=A()

     f、__str__和__repr__改变目的的字符串展现

亚洲必赢官网 9亚洲必赢官网 10

class Foo:
 2     def __init__(self,name):
 3         self.name = name
 4     def __repr__(self):
 5         return 'obj in str'  #这里只能是return
 6     # def __str__(self):
 7     #     return '%s obj in str'%self.name
 8 f = Foo('egon')
 9 print(f)  #优先执行__str__里面的内容
10 # 那么你是不是据地__repr__没用呢?
11 # print('%s'%f)  #执行的是__str__里面的返回值
12 # print('%r'%f)  #执行的是__repr__里面的返回值
13 print('==============')
14 print(str(f))  #当执行str(f)时,会去找__str__这个方法,如果找不到的时候,__repr__这个方法就给替补了
15 print(repr(f))
16 #1.当打印一个对象的时候,如果实现了__str__方法,打印__str__中的返回值
17 # 2.当__str__没有被实现的时候,就会调用__repr__方法
18 # 3.但是当你用字符串格式化的时候,%s和%r会分别调用__str__和__repr__方法
19 # 4.不管是在字符串格式化的时候还是在打印对象的时候,
20 # __repr__方法都可以作为__str__方法的替补,但反之则不行
21 # 5.用于友好的表示对象。如果__str__和__repr__方法你只能实现一个:先实现__repr__

__str__,__repr__

    1五 、内置方法

           a、静态方法和类方式

             
 壹 、类措施:有个默许参数cls,并且能够一向用类名去调用,能够与类属性交互(约等于能够应用类属性)

             
 二 、静态方法:让类里的点子直接被类调用,就像正规调用函数一样

           b、类措施和静态方法的相同点:都得以直接被类调用,不需求实例化

           c、类措施和静态方法的不一致点:

          类方法必须有二个cls参数表示这一个类,能够选拔类属性

           静态方法不须要参数

           d、绑定方法:分为普通方法和类格局

     普通方法:私下认可有贰个self对象传进来,并且只好被对象调用——-绑定到指标

     类方法:暗许有一个cls对象传进来,并且能够被类和指标(不引进)调用—–绑定到类

           
e、非绑定方法:静态方法:没有设置暗中同意参数,并且能够被类和目标(不推荐)调用—–非绑定

    1陆 、接口类与抽象类

             a、 接口类:(在抽象类的底蕴上)

         在python中,私下认可是未曾接口类的           

                    接口类不能够被实例化(倘诺实例化会报错)

          接口类中的方法不能够被达成

接口也就是做约束,让下面的类的方法都按照接口类中给出的方法去定义。如果接口类里面有的方法类里面没有,那么那个类就不能被实例化。(字面理解)

继承的第二种含义非常重要。它又叫“接口继承”。
接口继承实质上是要求“做出一个良好的抽象,这个抽象规定了一个兼容接口,使得外部调用者无需关心具体细节,可一视同仁的处理实现了特定接口的所有对象”——这在程序设计上,叫做归一化。

           b、抽象类

在python中,默认是有的

    父类的方法,子类必须实现

    抽象类(父类)的方法可以被实现

抽象类和接口类的区别:接口类不能实现方法,抽象类可以实现方法里面的内容

抽象类和接口类的相同点:都是用来做约束的,都不能被实例化

抽象类和接口类的使用:

  当几个子类的父类有相同的功能需要被实现的时候就用抽象类

  当几个子类有相同的功能,但是实现各不相同的时候就用接口类

 

措施的重写

 

父类里一些艺术,在子类里再度落成

   self 是四个款式参数,当执行 obj1 = Foo(‘wupeiqi’, 18 ) 时,self
等于 obj1

贰 、继承的三种用途:

                                   当执行 obj2 = Foo(‘alex’, 78 )
时,self 等于 obj2

b:继承基类的主意,并且做出本人的转移依然增加(代码重用)

 

a:注明某些子类包容于某基类,定义1个接口类Interface,接口类中定义

  所以,内容实在被包裹到了对象 obj1 和 obj2 中,各种对象中都有 name 和
age 属性,

了某个接口名(正是函数名)且从未达成接口的功用,子类继承接口类,并且达成接口中的效能

  在内部存款和储蓄器里好像于下图来保存。

b、封装

 

1、优点:

亚洲必赢官网 11

a、将转移隔开分离

 

b、封装使用

  3. 第贰步:从某处调用被卷入的内容

c、升高复用性

   调用被卷入的剧情时,有二种意况:

d、进步安全性

    • 透过对象直接调用
    • 由此self直接调用

二 、封装原则:

  1> 通过对象直接调用被包裹的始末

a、将不要求对外提供的剧情都藏匿起来

   上海体育场所突显了对象 obj1 和 obj2
在内部存款和储蓄器中保留的点子,依据保存格式能够那样调用被封

b、把质量都掩藏起来提供公共艺术对其访问

   装的内容:对象.属性名

三 、私有变量和个人方法

class Foo:

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

obj1 = Foo('wupeiqi', 18)
print obj1.name    # 直接调用obj1对象的name属性
print obj1.age     # 直接调用obj1对象的age属性

obj2 = Foo('alex', 73)
print obj2.name    # 直接调用obj2对象的name属性
print obj2.age     # 直接调用obj2对象的age属性

a、在python中用双写道的开首的的点子降属性隐藏起来(设置个人的)

 

property属性

 

property是一种新鲜的特性,访问它时会执行一段功能(函数)然后重回值

经过self直接调用被打包的内容

c、多态:”多态指的是一类东西有各个形态(比如:老师.下课铃响了(),学生.下课铃响了(),老师执行的是下班操作,学生举行的是放学操作,即使两者音信一点差距也没有于,可是进行的功能分裂)

   执行类中的方法时,须要经过self直接调用被卷入的剧情

多态指的是:一类东西有三种气象

class Foo:

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

    def detail(self):
        print self.name
        print self.age

obj1 = Foo('wupeiqi', 18)
obj1.detail()  # Python默认会将obj1传给self参数,即:obj1.detail(obj1),所以,此时方法内部的 self = obj1,即:self.name 是 wupeiqi ;self.age 是 18

obj2 = Foo('alex', 73)
obj2.detail()  # Python默认会将obj2传给self参数,即:obj1.detail(obj2),所以,此时方法内部的 self = obj2,即:self.name 是 alex ; self.age 是 78

python自带多态:

亚洲必赢官网, 

多态:同一类东西的各样处境

  4.
综合,对于面向对象的卷入来说,其实正是采取构造方法将内容封装到
对象

python里四处都以多态,只是大家一般发现不了

   中,然后通过对象直接或许self直接获取棉被服装进的剧情

操作的时候不供给关注那一个目的的数据类型,你只要用就行了

 

15、反射

 

一 、反射:能够用字符串的主意去做客对象的属性,调用对象的法门(不过不能够去访问方法),python中一切皆对象,都得以应用反射。

五, 封装性与扩展性

贰 、反射有三种办法:

  1.
封装在于鲜明区分内外,使得类达成者能够修改封装内的东西而不影响外部调用者的

hasattr:hasattr(object,name)判断2个目的是不是有name属性只怕name方法。有就赶回True,没有就赶回False

   代码;而外部使用者只知道叁个接口(函数),只要接(函数)名、参数不变,使用者的

getattr:获取对象的习性也许措施,借使存在则打字与印刷出来。hasattr和getattr配套使用

   代码永远无需改变。那就提供三个了不起的通力合营基础——恐怕说,只要接那些基础约定

需求专注的是,借使回到的是目的的主意,重回出来的是指标的内部存款和储蓄器地址,若是急需周转那一个法子,能够在背后添加一对()

   不变,则代码改变不足为虑.

setattr:给目的的属性赋值,若属性不存在,先创立后赋值

#类的设计者
class Room:
    def __init__(self,name,owner,width,length,high):
        self.name=name
        self.owner=owner
        self.__width=width
        self.__length=length
        self.__high=high
    def tell_area(self): #对外提供的接口,隐藏了内部的实现细节,此时我们想求的是面积
        return self.__width * self.__length


#使用者
>>> r1=Room('卧室','egon',20,20,20)
>>> r1.tell_area() #使用者调用接口tell_area


#类的设计者,轻松的扩展了功能,而类的使用者完全不需要改变自己的代码
class Room:
    def __init__(self,name,owner,width,length,high):
        self.name=name
        self.owner=owner
        self.__width=width
        self.__length=length
        self.__high=high
    def tell_area(self): #对外提供的接口,隐藏内部实现,此时我们想求的是体积,内部逻辑变了,只需求修该下列一行就可以很简答的实现,而且外部调用感知不到,仍然使用该方法,但是功能已经变了
        return self.__width * self.__length * self.__high


#对于仍然在使用tell_area接口的人来说,根本无需改动自己的代码,就可以用上新功能
>>> r1.tell_area()

delattr:删除该对象钦定的3个属性

 

a、内置方法:isinstance和issubclass

 

isinstance(obj,cls)检查是不是obj是不是是类 cls 的靶子

六, 面向对象结构解析

class Foo: passclass Son(Foo): passs=Son()print(isinstance(s,Son))

  

b、内置方法:issubclass(sub, super)检查sub类是不是是 super 类的派生类

  1.  如下边包车型客车图所示:面向对象全体大致分两块区域:

class Foo(object): pass

 

class Bar(Foo): pass

亚洲必赢官网 12

issubclass(Bar, Foo)

  那么各种大区域又足以分成四个小片段

c、python面向对象中的反射:通过字符串的样式操作对象相关的习性,python中漫天事物都是指标(都能够用反射)

class A:

    company_name = '老男孩教育'  # 静态变量(静态字段)
    __iphone = '1353333xxxx'  # 私有静态变量(私有静态字段)


    def __init__(self,name,age): #普通方法(构造方法)

        self.name = name  #对象属性(普通字段)
        self.__age = age  # 私有对象属性(私有普通字段)

    def func1(self):  # 普通方法
        pass

    def __func(self): #私有方法
        print(666)


    @classmethod  # 类方法
    def class_func(cls):
        """ 定义类方法,至少有一个cls参数 """
        print('类方法')

    @staticmethod  #静态方法
    def static_func():
        """ 定义静态方法 ,无默认参数"""
        print('静态方法')

    @property  # 属性
    def prop(self):
        pass

自作者批评是还是不是包涵某属性—hasattr 再次回到布尔值

 

获得属性—getattr 没有就会报错

  2. 面向对象的公有私有 

设置属性—setattr

   1>  对于每三个类的积极分子而言都有二种样式:

删除属性—delattr

    •  公有成员,在其他地方都能访问
    •  私有成员,唯有在类的中间才能情势

d、内置方法:__del__

 

析构方法,当目的在内部存款和储蓄器中被保释时,自动触发执行。

      2> 私有成员和国有成员的造访限制分化:

注:此办法一般不要定义,因为Python是一门高级语言,程序员在选拔时无需关切内部存款和储蓄器的分配和刑满释放解除劳教,因为此工作都是提交Python解释器来进行,所以,析构函数的调用是由解释器在进展垃圾回收时自动触发执行的。

    静态字段(静态变量)

class Foo: def __del__(self): print(‘fgs’)

    •  公有静态字段:类能够访问;类内部可以访问;派生类中能够访问
    •  私有静态字段:仅类内部能够访问;

    class C:

    name = "公有静态字段"
    
    def func(self):
        print C.name
    

    class D(C):

    def show(self):
        print C.name
    

f=Foo()print(123)print(123)del fprint(123)print(123)print(123)

C.name         # 类访问

obj = C()
obj.func()     # 类内部可以访问

obj_son = D()
obj_son.show() # 派生类中可以访问

e、内置方法:item类别

 

__getitem__\__setitem__\__delitem__

class C:

    __name = "私有静态字段"

    def func(self):
        print C.__name

class D(C):

    def show(self):
        print C.__name


C.__name       # 不可在外部访问

obj = C()
obj.__name  # 不可在外部访问
obj.func()     # 类内部可以访问   

obj_son = D()
obj_son.show() #不可在派生类中可以访问  

__new__

 

class A: def __init__(self): #有一个措施在帮您创制self

 

print(‘in init function’)

  3. 属性

self.x=1 def __new__(cls, *args, **kwargs): print(‘in init
funct’) return object.__new__(A,*args,**kwargs)

*  1>
property是
一*种特殊的性格,访问它时会执行一段作用(函数)然后重临值

a=A()

例一:BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性而非方法,如果我们将其做成一个属性,更便于理解)

成人的BMI数值:
过轻:低于18.5
正常:18.5-23.9
过重:24-27
肥胖:28-32
非常肥胖, 高于32
  体质指数(BMI)=体重(kg)÷身高^2(m)
  EX:70kg÷(1.75×1.75)=22.86

class People:
    def __init__(self,name,weight,height):
        self.name=name
        self.weight=weight
        self.height=height
    @property
    def bmi(self):
        return self.weight / (self.height**2)

p1=People('egon',75,1.85)
print(p1.bmi)

f、__str__和__repr__改变目的的字符串展现

 

__str__,__repr__

  2> 为何要用property

1五 、内置方法

  将3个类的函数定义成特色未来,对象再去行使的时候obj.name,根本无法察觉自个儿的name

a、静态方法和类措施

  是履行了2个函数然后总括出来的,那种特征的应用方法遵从了统一访问的条件

一 、类格局:有个默许参数cls,并且能够直接用类名去调用,能够与类属性交互(也正是足以选用类属性)

  由于新型类中具备二种访问方式,大家得以依照他们几天本性的走访特点,分别将八个方

贰 、静态方法:让类里的法门直接被类调用,就像不荒谬调用函数一样

  法定义为对同贰性情能:获取、修改、删除

b、类方式和静态方法的相同点:都能够直接被类调用,不要求实例化

class Goods(object):

    def __init__(self):
        # 原价
        self.original_price = 100
        # 折扣
        self.discount = 0.8

    @property    #将该方法伪装成一个属性,在代码级别上没有本质的提升,但是让其看起来很合理.
    def price(self):
        # 实际价格 = 原价 * 折扣
        new_price = self.original_price * self.discount
        return new_price

    @price.setter  #固定写法, 其中伪装的函数属性名,要修改的方法属性名和 @属性名.setter 要一致
    def price(self, value):
        self.original_price = value

    @price.deltter
    def price(self, value):
        del self.original_price

obj = Goods()
obj.price         # 获取商品价格
obj.price = 200   # 修改商品原价
del obj.price     # 删除商品原价

c、类情势和静态方法的区别点:

 

类形式必须有3个cls参数表示这么些类,能够运用类属性

  4. 类方法:  @classmethod

静态方法不要求参数

    应用场景:

d、绑定方法:分为普通方法和类措施

     (1), 类中有个别措施是不必要传入对象,不要对象的百分百事物

一般而言方法:暗许有二个self对象传进来,并且只可以被对象调用——-绑定到指标

     (2), 对类中的静态变量实行转移

类措施:默许有贰个cls对象传进来,并且能够被类和对象(不推荐)调用—–绑定到类

     (3),
继承中,父类获得子类的空间(子类类名调用,类名传给cls,父类中则会拿走子类地址)

e、非绑定方法:静态方法:没有安装暗中同意参数,并且能够被类和目的(不引进)调用—–非绑定

      

1陆 、接口类与抽象类

class A:
    def func(self):# 普通方法
        print(self)

    @classmethod    #类方法
    def func1(cls)
        print(cls)


a = A()
a.func()    #对象调用的普通方法
A.func(a)    #类名调用的普通方法

A.func1()  #类方法:通过类名调用的方法,类方法中第一个参数约定俗成是 cls
                        #python自动将类名(类空间)传给 cls    

a、 接口类:(在抽象类的底子上)

  注意:对象调用类方法,cls 得到的是类本人

在python中,私下认可是尚未接口类的

  

接口类不能够被实例化(倘诺实例化会报错)

  5. 静态方法:  @staticmethod

接口类中的方法不可能被实现

    优点: 1. 代码块清晰  2. 充实复用性  

接口也正是做约束,让下边包车型地铁类的法门都依照接口类中提交的章程去定义。如若接口类里面有个别方法类里面没有,那么那一个类就不能够被实例化。(字面掌握)

class  A :
    @staticmethod
    def func(self):
        print(33)

A.func()
#结果: 33

后续的第两种意义非凡关键。它又叫“接口继承”。

 

接口继承实质上是供给“做出贰个美观的抽象,这么些抽象规定了1个合营接口,使得外部调用者无需关切具体细节,可并排的处理落成了一定接口的有所目的”——那在程序设计上,叫做归一化。

 

b、抽象类

七,  isinstance与issubclass

在python中,暗中同意是一些

isinstance(obj,cls) 检查obj是或不是是类 cls 的靶子

父类的法门,子类必须兑现

class A: pass

class B(A): pass

obj = B()
print(isinstance(obj,B))  #True  判断对象所属关系,包含所有继承关系,只要是
print(isinstance(obj,str))  #True
print(type(obj) is str)     #不包含继承系,只管一层

抽象类(父类)的艺术能够被落成

 

抽象类和接口类的区分:接口类不可能兑现情势,抽象类能够兑现形式里面的剧情

issubclass(sub, super)检查sub类是或不是是 super 类的派生类

抽象类和接口类的相同点:都以用来做约束的,都无法被实例化

class A: pass

class B(A): pass

abj = B()

print(issubclass(B,A)) #True  #判断类的继承关系

抽象类和接口类的运用:

 

当多少个子类的父类有相同的效率供给被达成的时候就用抽象类

八,反射

当多少个子类有同一的作用,不过落到实处各不一样的时候就用接口类

   getattr  hasattr  setattr  delattr

亚洲必赢官网 13

    hasattr : 判断类中是否存在要调用的变量或格局

    getattr : 可与hasattr 结合使用,若hasattr判断存在,则执行 getattr.

    getattr (空间名 , ‘空间内的变量’)  能够用作是对
空间名.空间内的变量 举行沟通

 

  1.
python面向对象中的反射:通过字符串数据类型的变量名来访问这几个变量的值。python

   中的一切事物都以目的(都足以行使反射)

    类名反射 : 静态属性  类方法  静态方法

    对象反射 : 对象属性  方法  

    模块  :  模块中的方法

    自身模块中:

      import sys   mymodule =
[‘__main__’]   getattr(mymodule.’变量名’)

  

  2. 选取对象来反光:

class Foo:
    f = '类的静态变量'
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def say_hi(self):
        print('hi,%s'%self.name)

obj=Foo('egon',73)

#检测是否含有某属性  若能找到返回True,找不到返回False
print(hasattr(obj,'name'))
print(hasattr(obj,'say_hi'))

#获取属性
n=getattr(obj,'name')
print(n)
func=getattr(obj,'say_hi')()

print(getattr(obj,'aaaaaaaa','不存在啊')) #报错

#设置属性
setattr(obj,'sb',True)
setattr(obj,'show_name',lambda self:self.name+'sb')
print(obj.__dict__)
print(obj.show_name(obj))

#删除属性
delattr(obj,'age')
delattr(obj,'show_name')
delattr(obj,'show_name111')#不存在,则报错

print(obj.__dict__)

 

  3. 实用类来反光:

class Foo(object):

    staticField = "old boy"

    def __init__(self):
        self.name = 'wupeiqi'

    def func(self):
        return 'func'

    @staticmethod
    def bar():
        return 'bar'

print (getattr(Foo, 'staticField'))#调用静态字段 结果为 : old boy
print (getattr(Foo, 'func'))#调用函数,打印的是内存地址
print (getattr(Foo, 'bar')())#调用静态函数,结果为 : bar

亚洲必赢官网 14

 

  4. 对方今模块反射

  首先找到本人日前文件所在的命名空间

  

import sys

def s1():
    print('s1')

def s2():
    print('s2')

 this_module = sys.modules[__name__]#获取当前模块的空间地址

hasattr(this_module, 's2')
getattr(this_module, 's2')

 

  5. 对其他模块反射

import sys


def s1():
    print('s1')


def s2():
    print('s2')

this_module = sys.modules[__name__] 

hasattr(this_module, 's1') 
getattr(this_module, 's2')

 亚洲必赢官网 15

 

九, 内置方法(双下划线办法,魔术点子,类中的特殊措施)

     __名字__  类中的每一个双下划线办法都有她本身的卓越含义

   内置函数和松手药方法是有细心关系的

   全部的放置方法不需求再外部直接调用,而是用一些别样的放到函数或独特的语法来机关

   触发那几个内置方法

  1. __call__  对象前面加括号,触发执行。

     注:__init__措施的履行是由创制对象触发的,即:对象 = 类名()
;而对此 __call__ 方法的

   执行是由对象后加括号触发的,即:对象() 或然 类()()

class Foo:

    def __init__(self):
        pass

    def __call__(self, *args, **kwargs):

        print('__call__')


obj = Foo() # 执行 __init__
obj()       # 执行 __call__

 

  2. __len__

class A:
    def __init__(self):
        self.a = 1
        self.b = 2

    def __len__(self):
        return len(self.__dict__)  #__len__方法return的值就是len函数的返回值
a = A()
print(len(a))  #len(obj)相当于调用了这个对象的__len__方法,如果obj对象没有__len__方法
            那么len函数就会报错

 

  3.__new__

   构造方法  :__new__

   开始化方法: __init__

  1>  面向对象在实例化时:

   1.开辟3个空间,属于对象的  2.
把目的空间传给self,执行init,封装属性

   3. 将以此目的空间再次来到给调用者

  2>  __new__开辟空间,重返给self,
在实例化对象之后,__init__之前,执行__new__方法.

class SIngle:
        def __new__(cls,*args,**kwargs):
                print('在new方法里')
                obj=object.__new__(cls)
                print('在new方法里',obj)
                return  obj
         def __init__(self):
               print('在init方法里',self)

obj=SIngle()

  3> 单例类

   假使3个类,从头到尾只可以有一个实例,表达只开发一块属于对象的上空,那么这几个类就是一

    个单例类

class A:
    __instance = None
    def __new__(cls, *args, **kwargs):
        if not cls.__instance:#不空则执行下面程序,若为空则不执行,即只开辟一次空间
           cls.__instance=object.__new__(cls)#调用object类中的__new__方法,开辟一个空间
        return cls.__instance#返回空间地址
    def __init__(self,name,age):#把空间地址传给self
        self.name=name
        self.age=age

s1=A('he',23)
s2=A('ha',30)#返回的还是第一次开辟的空间,只是s2的属性将会覆盖原来的属性
print(s1.name)
print(s2.name)
#结果:  ha ha

 

  4.  __str__

  假若2个类中定义了__str__艺术,那么在打字与印刷 对象
时,默许输出该办法的回到值.

class A:
    def __init__(self):
        pass
    def __str__(self):
        return '白'
a = A()
print(a)    #相当于调用a的__str__方法
print('%s' % a)#相当于执行a.__str__方法

另:print(str(obj))  #内置的数据类型相当于执行obj.__str__方法

 

  5. __repr__ :

    1> __repr__ 是__str
__的备胎,如果有__str__办法,那么 print, %s,  str 都去履行str方法,

      并且动用str的再次来到值;借使没有__str__,那么print, %s,
str都会履行repr

      repr(obj)  %r 

     2>
在子类中选用__str__,先找子类的__str__,没有的话要向上找,只要父类不是object,就

      执行父类的__str__,不过一旦出了object之外的父类都并未__str__办法,就推行子类的

      __repr__措施,假如子类也从未,还要升高继续找父类中的__repr__方法,一贯找不到

      再执行object类中的__str__的方法

class A:
    def __init__(self,name):
        self.name=name
    def __str__(self):
        return '**%s**' % self.name
    def __repr__(self):
        return self.name
a = A('alex')
print(a)
print(str(a),repr(a))
print('%s , %r' % (a,a))


#注意:
# %r : 把 repr 的返回结果给 %r;
# %s :把 str 的返回结果给 %s

 

  6. getattr(object, name[default])  

  获取对象object的属性也许措施,假使存在打字与印刷出来,要是不存在,打字与印刷出暗许值,私下认可值

  可选。供给小心的是,假若是回去的靶子的法门,重回的是形式的内部存储器地址,假如急需周转

  那几个办法,能够在后头添加一对括号。

>>> class test():
...     name="xiaohua"
...     def run(self):
...             return "HelloWord"
...
>>> t=test()
>>> getattr(t, "name") #获取name属性,存在就打印出来。
'xiaohua'
>>> getattr(t, "run")  #获取run方法,存在就打印出方法的内存地址。
<bound method test.run of <__main__.test instance at 0x0269C878>>
>>> getattr(t, "run")()  #获取run方法,后面加括号可以将这个方法运行。
'HelloWord'
>>> getattr(t, "age")  #获取一个不存在的属性。
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: test instance has no attribute 'age'
>>> getattr(t, "age","18")  #若属性不存在,返回一个默认值。
'18'
>>>

  

  7. setattr(object, name, values)

  给指标的性质赋值,若属性不设有,先创造再赋值.

>>> class test():
...     name="xiaohua"
...     def run(self):
...             return "HelloWord"
...
>>> t=test()
>>> hasattr(t, "age")   #判断属性是否存在
False
>>> setattr(t, "age", "18")   #为属相赋值,并没有返回值
>>> hasattr(t, "age")    #属性存在了
True
>>>

 

  8. item 各样: 和对象使用 [ ] 访问值有联系

    __getitem__

class B:
  #def __init__(self,lis):
    #self.lis = lis
  def __getitem__(self,item):
    return  getattr(self,item)
    #return self.lis[litem]
  def __setitem__(self,key,value):
    setattr(self,key,value)
    #self.lis[key] = vslue
  def __delitem__(self,key):
    delattr(self,key)
    #self.lis.pop(key)

b = B()

b['k'] = 'v1'  #触发__setitem__
print(b['k1']) #  __getitem__
del b['k1']   #  __delitem__

#b = B(['11','22','33','44'])
#print(b.lis[0])
#B[3] = '99'
#print(b.list)
#del b[2]
#print(b.lis)

 

  9. hash方法

   底层数据结构基于hash值寻址的优化操作

   hash是八个算法可以把某贰个要留存内部存储器里的值通过一多级总括,保障不一致值hash

   值的结果差别.

   对通二个值多次推行的python代码的时候hash值的结果是例外的,可是对通八个值

   再痛贰次进行python代码的时候hash值永远不变. 

class Employee:
    def __init__(self,name,age,sex,partment)
        self.name=name
        self.age=age
        self.sex = sex
        self.partment = partment
    def__hash__(self):            #筛选hash值相等
        return hash('%s%s' % (self.name,self.sex))
    def __eq__(self,other):        #筛选值相等
        if self.name == other.name and self.sex == other.sex
            return True
    employ_lst = [...]
    for i in range(200)
            employ_lst.append(Employee('alex',i,'male','python'))
     for i in range(200)
            employ_lst.append(Employee('wusir',i,'male','python'))  
    for i in range(200)
            employ_lst.append(Employee('taibai',i,'male','python'))    
employ_lst = set(employ_lst)
for person in employ set :
    print(person.__dic__ )


#set集合的去重原理

  10. eq 方法

class A :
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __eq__(self,other):
        if self.name == other.name and self.age == other.age:
            return True

a = A('小白',88)
aa = A('大白'99)
aaa = A('超大白',100)

print(a,aa)
print(a == aa == aaa)     # == 这个语法是完全和__eq__相关

 

  11. 析构方法  

    释放3个空中

    归还/释放部分在成立对象的时候借用的部分能源

class A :    
    def __del__(self):   #析构方法 del A的对象 会自动触发这个方法 
        print('饿了吗')
a = A()
del a    #对象删除 del    当不主动进行该操作时,python解释器在程序执行
                #完后也会自动触发 __del__ 函数(垃圾回收机制).
print(a)        

 

 

    

   

 

网站地图xml地图