① 、面向对象

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

① 、面向对象

   ① 、面向进程

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

     
 b、缺点:一套流水生产线只怕流程正是来缓解2个难点,代码就是牵一发而苏州全身

   二 、面向对象

     
 a、优点:化解程序的扩大性,对某多个对象单独修改,会马上反应到全体体系中

     
 b、缺点:可控性差,不能够向面向进程的次序设计流水生产线式的可以很精准的前瞻难题的拍卖流程与结果,面向对象的程序一旦起头就有指标之间的竞相消除难点。

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

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

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

   六 、在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)  #引用人的走路方法,注意,这里不是在调用

   
10、例化:类名加括号正是实例化,会自行触发__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、常见二个类就会成立二个类的称谓空间,用来储存类中定义的具备名字,那一个名字成为类的习性

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

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

创造3个指标/实例就会创立一个对象/实例的称号空间,存放对象/实例的名字,称为对象/实例的习性

姿色对象的组合用法:

组合指的是,在2个类中以此外3个类的目的作为数据属性,称为类的组

列子:

金沙注册送58 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、反射     

        一 、反射:能够用字符串的不二法门去拜访对象的性子,调用对象的格局(不过不能够去拜谒方法),python中整整皆对象,都得以运用反射。

        ② 、反射有多种方法:

             
 hasattr:hasattr(object,name)判断3个对象是否有name属性恐怕name方法。有就回到True,没有就回到False

金沙注册送58,             
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系列

金沙注册送58 2

一,.接口类

   1、面向进度

__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__改变指标的字符串呈现

金沙注册送58 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、类格局和静态方法的差异点:

          类方法必须有三个cls参数表示那一个类,能够运用类属性

           静态方法不必要参数

           d、绑定方法:分为一般方法和类措施

     普通方法:默许有三个self对象传进来,并且只可以被对象调用——-绑定到目标

     类方法:私下认可有叁个cls对象传进来,并且能够被类和目的(不推荐)调用—–绑定到类

           
e、非绑定方法:静态方法:没有安装默许参数,并且能够被类和指标(不推荐)调用—–非绑定

    1六 、接口类与抽象类

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

         在python中,私下认可是从未有过接口类的           

                    接口类不能被实例化(假如实例化会报错)

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

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

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

           b、抽象类

在python中,默认是有的

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

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

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

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

抽象类和接口类的使用:

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

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

 

① 、面向对象
① 、面向进度a、优点:十分大的大跌了写程序的复杂度,只供给顺着执行的步调,堆叠代…

一 、面向对象

  1. 继承有三种用途  

     
 a、优点:相当大的下滑了写程序的复杂度,只需求顺着执行的步子,堆叠代码即可

一 、面向进程

  1>:继承基类的方法,并且做出本人的变更照旧扩大(代码重用)  

     
 b、缺点:一套流水生产线只怕流程正是来消除三个标题,代码就是牵一发而西安全身

a、优点:十分的大的狂跌了写程序的复杂度,只需求顺着执行的步骤,堆叠代码即可

  2>:注解某些子类包容于某基类,定义三个接口类Interface,接口类中定义了有个别接口

   贰 、面向对象

b、缺点:一套流水生产线也许流程正是来缓解1个题材,代码正是牵一发而罗利全身

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

     
 a、优点:化解程序的扩大性,对某2个目的单独修改,会立时反应到一切系统中

② 、面向对象

 

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

a、优点:消除程序的扩充性,对某3个指标单独修改,会即时反应到全连串统中

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

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、缺点:可控性差,不能够向面向进度的先后设计流水生产线式的能够很精准的测度难点的处理流程与结果,面向对象的次序一旦起初就有目的之间的交互化解难题。

  

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

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

  2.
履行中,继承的首先种意义意义并不十分大,甚至通常是风险的。因为它使得子类与基

   五 、实例化:类——>对象的经过

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

   类现身强耦合。

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

伍 、实例化:类——>对象的经过

     1>  继承的第两种意义极度重庆大学。它又叫“接口继承”。
    
 接口继承实质上是讲求“做出1个美好的虚幻,那一个抽象规定了1个匹配接口,使得外

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

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

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

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

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

    def 方法名(self):
        pass

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

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

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

    ⑧ 、类的三种效应:属性引用和实例化

class Person: #概念1人类

   归一化使得高层的外部使用者能够不加区分的拍卖全体接口包容的对象集合——就好

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

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)  #引用人的走路方法,注意,这里不是在调用

python面向对象,Python之面向对象总计。class 类名:

 

    11、

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

   2>
注意:在python中一贯就从不贰个称为interface的第1字,上面包车型地铁代码只是看起来像

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

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

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

实例增加属性
实例.新的属性名 = 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__)) #字符串数据类型的类名

金沙注册送58 4

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

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

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

    类去达成接口中的函数。
这么做的意思在于归一化,什么叫归一化,就是只

         
 a、常见1个类就会创建三个类的称呼空间,用来储存类中定义的兼具名字,这个名字改为类的习性

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

    即使依照同1个接口完结的类,那么具有的那个类发生的目的在运用时,从用

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

class Person: #概念一位类

    法上来说都一样。
归一化,让使用者无需关心对象的类是如何,只须要的知情

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

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

    这么些目的都持有有些职能就足以了,那庞大地下跌了使用者的施用难度。

创设2个对象/实例就会创建2个指标/实例的名目空间,存放对象/实例的名字,称为对象/实例的性质

def walk(self): #人都足以走路,也正是有二个行进方法

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

外貌对象的咬合用法:

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

    鼠的类去落到实处了该接口,松鼠的类也去完结了该接口,由两岸分别爆发2只老鼠

结合指的是,在二个类中以此外贰个类的靶子作为数据属性,称为类的组

十 、例化:类名加括号就是实例化,会活动触发__init__函数的运营,可以用它来为各样实例定制自身的特色

    和3只松鼠送到你前边,即便是您分别不到底哪只是哪些鼠你势必知道他们都会

列子:

class Person: #概念3个生人

    跑,都会吃,都能呼吸。
再比如说:咱们有七个汽车接口,里面定义了小车拥有

金沙注册送58 5金沙注册送58 6

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

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

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,还是Ford大家都会开了,开的时候根本无需关切自身开的是哪一种车,操作

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

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也有抽象类的定义不过同样须求依赖模块达成,抽象类是2个奇特

              ① 、继承的语法

类名.方法名

   的类,它的超常规之处在于只好被接二连三,不能被实例化

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

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

 

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

 

              贰 、继承的三种用途:                

实例.方法名()

  2. 为何要有抽象类

                 
b:继承基类的法门,并且做出本身的变更依旧扩充(代码重用)***
  ***

实例.对象属性

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

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

实例增添属性

   的剧情而来的,内容包涵数据属性和函数属性。

                       
 **
 了有的接口名(便是函数名)且从未实现接口的功能,子类继承接口类,并且达成接口中的功用**

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

   
比如大家有香蕉的类,有苹果的类,有桃子的类,从那些类抽取相同的内容正是水果那

           b、封装

12、关于self

   个抽象的类,你吃水果时,要么是吃贰个切实可行的香蕉,要么是吃二个实际的桃子,你永远

                  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、将不须求对外提供的始末都躲藏起来

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

 

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

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

  2. 抽象类与接口类

                  叁 、私有变量和村办方法

#结果重临多少个对象指标名.对象的性质1 #翻看对象的本性,间接用
对象名.属性名 即可对象名.方法名() #调用类中的方法,直接用
对象名.方法名() 即可

   抽象类的真相依然类,指的是一组类的相似性,包涵数据属性(如all_type)和函数属

                             
a、在python中用双写道的先导的的办法降属性隐藏起来(设置个人的)

金沙注册送58 7

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

property属性

dir(类) #回去类中的所盛名字列表isinstance(对象,类)
#看清目的是否为类的实例print(Person.__dict__) # 再次回到三个字典
key是属性名,value是属性值print(Person.__module__)
#person类所在的模块print(Person.__name__,type(Person.__name__))
#字符串数据类型的类名

   抽象类是2个在于类和接口间接的2个概念,同时具备类和接口的一些天性,能够

property是一种独特的个性,访问它时会执行一段作用(函数)然后重回值

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

   用来落到实处归一化设计 

  

a、常见贰个类就会创立1个类的称号空间,用来储存类中定义的装著名字,这几个名字改为类的品质

   

         
 c、多态:”多态指的是一类东西有多样模样(比如:老师.下课铃响了(),学生.下课铃响了(),老师执行的是下班操作,学生进行的是放学操作,即便双方音信没有差距于,但是实行的功能分化)

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

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

                   多态指的是:一类东西有种种情景

静态属性就是一贯在类中定义的变量

   一些大旨的概念。

python自带多态:

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

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

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

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

 

 

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

  4. 多三番玖遍难题

    15、反射     

面容对象的结缘用法:

    在继续抽象类的历程中,大家相应尽量制止多再三再四;
    而在继承接口的时候,大家反而鼓励你来多三番肆回接口

        一 、反射:可以用字符串的法门去访问对象的特性,调用对象的章程(不过不能够去拜谒方法),python中漫天皆对象,都得以选拔反射。

构成指的是,在一个类中以其它3个类的对象作为数据属性,称为类的组

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

        ② 、反射有种种方法:

列子:

 

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

圆的周长与面积

  6. 方法的兑现

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

1肆 、面向对象的三大特征

   在抽象类中,大家得以对一些华而不实方法做出基础完结;
   而在接口类中,任何措施都只是一种标准,具体的作用须要子类完毕

                
需求留意的是,如果回去的是目的的点子,再次回到出来的是目的的内部存款和储蓄器地址,假使要求周转那一个方法,能够在后头添加一对()

a、继承

 

               setattr:给指标的习性赋值,若属性不存在,先创设后赋值

class Animal: #父类 基类 超类

三, 多态

               delattr:删除该目的钦定的一个属性

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系列

派生属性

金沙注册送58 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__变动目的的字符串显示

金沙注册送58 9金沙注册送58 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对象传进来,并且只可以被对象调用——-绑定到目的

     类方法:私下认可有3个cls对象传进来,并且可以被类和对象(不推荐)调用—–绑定到类

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

    1六 、接口类与抽象类

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

         在python中,暗中同意是未曾接口类的           

                    接口类不可能被实例化(如若实例化会报错)

          接口类中的方法不能够被完结

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

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

           b、抽象类

在python中,默认是有的

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

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

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

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

抽象类和接口类的使用:

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

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

 

主意的重写

 

父类里部分艺术,在子类里再一次完毕

   self 是一个花样参数,当执行 obj1 = Foo(‘wupeiqi’, 18 ) 时,self
等于 obj1

二 、继承的二种用途:

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

b:继承基类的法子,并且做出本人的改变或许扩展(代码重用)

 

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

  所以,内容其实被打包到了指标 obj1 和 obj2 中,每个对象中都有 name 和
age 属性,

了一些接口名(正是函数名)且并未落成接口的效率,子类继承接口类,并且实现接口中的功用

  在内存里好像于下图来保存。

b、封装

 

1、优点:

金沙注册送58 11

a、将转移隔开分离

 

b、封装使用

  3. 第2步:从某处调用棉被服装进的情节

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)判断3个对象是否有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:删除该指标钦定的贰性情能

 

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

金沙注册送58 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>  对于每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五 、内置方法

  将1个类的函数定义成特征未来,对象再去行使的时候obj.name,根本不可能察觉本人的name

a、静态方法和类措施

  是实践了两个函数然后总计出来的,那种特征的施用方法遵循了统一访问的标准化

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

  由于新型类中持有三种访问情势,我们能够依据他们多少个属性的拜会特点,分别将七个方

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

  法定义为对同3个天性:获取、修改、删除

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、类措施和静态方法的分化点:

 

类方式必须有一个cls参数表示那个类,能够运用类属性

  4. 类方法:  @classmethod

静态方法不供给参数

    应用场景:

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

     (1), 类中稍微措施是不供给传入对象,不要对象的整套事物

常见方法:暗中认可有1个self对象传进来,并且不得不被对象调用——-绑定到对象

     (2), 对类中的静态变量进行更改

类措施:暗中同意有1个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

持续的第贰种意义分外重大。它又叫“接口继承”。

 

接口继承实质上是讲求“做出贰个卓绝的架空,这几个抽象规定了3个匹配接口,使得外部调用者无需关心具体细节,可并排的拍卖完成了特定接口的兼具指标”——那在先后设计上,叫做归一化。

 

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

金沙注册送58 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

金沙注册送58 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')

 金沙注册送58 15

 

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

     __名字__  类中的每3个双下划线办法都有她协调的不一致通常意义

   内置函数和松开药方法是有密切关系的

   全数的内置方法不必要再外部直接调用,而是用部分别样的放权函数或新鲜的语法来机关

   触发那一个内置方法

  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.开拓2个空中,属于对象的  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> 单例类

   假若一个类,从头到尾只好有三个实例,表达只开发一块属于对象的长空,那么这几个类正是一

    个单例类

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__

  若是三个类中定义了__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值的结果是例外的,可是对通二个值

   再痛3回执行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地图