A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

阿木木的鞋带

初级黑马

  • 黑马币:30

  • 帖子:9

  • 精华:0

© 阿木木的鞋带 初级黑马   /  2018-6-22 21:34  /  1544 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


类与对象


1.定义类:


类是具有相同属性和行为的事物的统称


class Cat:
    """
    函数体
    """
    pass
2.创建对象:


某一个具体事物的存在 现实生活中看得见 摸得着


对象名1 = 类名()


对象名2 = 类名()
多个对象之间互不干扰 相互独立


3.为对象添加属性


tom = Cat()
tom.name = '汤姆'
print(tom.name)
4.在方法内获取对象的属性:


class Cat:
    """
    函数体
    """
    def eat(self):
        print('%s在喝水' % tom.name)
tom = Cat()
tom.name = '汤姆'
tom.eat()
print(tom.name)
5.self的作用


self 代表了当前调用方法的对象


6.__init__的使用


使用: 方法在创建对象后执行 一般用来初始化对象的共有属性


__init__传参的作用: 可以在self 后面定义需要用到的参数 init需要的参数,在创建对象时传递


def __init__(self,new_name):
        """
        魔法方法:在恰当的时机会自动执行的方法
        
        """
        print('init 执行了')
        self.name = new_name
class Cat:


    def __init__(self, new_name):
        self.name = new_name
        
xiaobai = Cat('伊丽莎白')


7.全局变量与属性的区别:


全局变量 在程序中只能有一个 self引用了一个对象,添加的各个属性在各个对象间独立存在


8.__str__方法的使用:


__str__方法会在打印对象时执行,一般用于返回对象的描述信息
__str__方法必须有返回值,并且返回值必须是字符串类型
def __str__(self):
        # print('str 执行了')
        return '我是 %s' % self.name
        ```


###### 9.__del__方法的使用:


__del__方法当对象被销毁时执行
__del__方法一般用于验证对象是否被销毁以及释放没有用的资源(关闭文件等)


接面向对象二10.私有属性:


属性前面加两个下划线,只有定义属性的类才能用,


如果在类之外为私有属性赋值,产生一个新的属性。


class Animal(object):
    def __init__(self, ):
        self.__age = 18  #  定义私有属性
11.私有方法:


只能在 类内部用的方法,方法前面加双下划线


私有权限:在属性名和方法名 前面 加上两个下划线 __ 类的私有属性 和 私有方法,都不能通过对象直接访问,但是可以在本类内部访问; 类的私有属性 和 私有方法,都不会被子类继承,子类也无法访问; 私有属性 和 私有方法 往往用来处理类的内部事情,不通过对象处理,起到安全作用。


12.父类,子类


Python3 没写父类的继承,就默认继承 object


Python2 如果没写继承 就是经典类,
写明object 是新式类


13.继承


子类可以继承父类的属性和方法


子类如果要使用父类的私有属性,只能通过共有方法


只要创建子类的对象,就默认执行了那个继承过来的__init__方法


(1)单继承


只继承了一个父类
(2)多继承


当父类有同名方法时 一般用强制调用方法指定调用哪一个父类


可以继承多个父类 也继承了父类的所有属性和方法


如果多个父类中有同名的 属性和方法,则默认使用第一个父类的属性和方法(根据类的魔法属性mro的顺序来查找)


is-a has-a 思维工具、逻辑工具


is-a 表示继承关系 is 前面是子类


has-a 表示属性关系 a 后面 是属性


当父类有同名方法时 一般用强制调用方法指定调用哪一个父类


14.重写


定义 父类不满足子类功能 子类写一个与父类同名的方法


重写后的方法,在调用时会调用自己类里面的方法, 变量 是重新赋值 不算重写方法


重写后 仍需要父类同名方法代码里的数据 内容:


1) 父类名.方法名(self,...) (多继承里用


super(子类名,子类对象“self”).父类方法()
super().父类方法() 只能在 py3中使用
上述方法传参: 如果被重写的方法需要接受参数 在子类调用方法时传参 一般父类需要的 参数 子类也要作为形参


15.__new__方法:


创建对象时执行,能够控制一个类是否要创建对象。


cls:表示调用方法时的类对象。


必须要 return后 才能创建对象。


__new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供


__new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类__new__出来的实例,或者直接是object的__new__出来的实例


    def __new__(cls, *args, **kwargs):
        obj = object.__new__(cls)
        return obj
__new__方法的传参:


用 不定长参数来接受参数 创建对象时的参数解释器会给__new__方法传来,但是__new__方法一般不会使用参数,此时可以使用不定长参数来接收


16. 类对象 与 类属性 实例对象 与 实例属性


类对象:


遇到class关键字 解释器会自动创建类对象


类属性:


当前类的所有实例对象共享一个类属性。


修改类属性:


类名.类属性 = 类属性


实例对象:


类创建出的对象,真实存在的东西


实例属性:


彼此相互独立,互补干扰。


17.实例方法 与 类方法、静态方法


实例方法:


方法的第一个参数是实例对象,叫实例方法


类方法


方法上写@classmethod 方法的第一个参数 一定是接受类对象的


静态方法:


方法上面加上 @staticmethod 方法不接受任何强制性参数


方法的调用 实例方法: 对象名.实例方法()


类方法: 类名.类方法()


静态方法:类名.静态方法()


class Person(object):


    __num = 0  # 私有类属性


    def __init__(self, name):
        self.name = name
        Person.__num += 1


    def drink(self):  # 方法的第一个参数接收的是实例对象,叫做实例方法
        print('%s 能喝' % self.name)


    @classmethod  # 装饰器
    def get_num(cls):  # 类方法,在方法上写一个 @classmethod ,方法的第一个参数必定是类对象
        print('get_num,cls=',cls)
        return cls.__num


    @staticmethod
    def add2num(a, b):  # 静态方法,在方法上写一个 @staticmethod ,方法不需要接收任何强制性的参数
        return a+b


zs = Person('张三')
# zs.drink()


# print(Person.get_num())  # 类方法调用,类名.类方法()
print(Person.add2num(11,22))  # 静态方法调用,类名.静态方法()
18.单例模式:


设计模式:


* 设计模式是由技术大牛们总结出来的一套代码模板
* 即使是技术不够强大的程序员,只要按照模板的套路来写,就可以解决比较复杂的问题
定义:一个类只允许创建一个对象 intance = None


    def __new__(cls, *args, **kwargs):
        # if cls.instance == None:  # 当类属性引用为 None 才创建新对象
        if not cls.instance:  # 当类属性引用为 None 才创建新对象
            cls.instance = object.__new__(cls)
        return cls.instance
19.if判断


class A(object):
    pass


tmp = 0  # False
tmp = 1  # True
tmp = -1  # True
tmp = 0.0  # False
tmp = 0.2  # True
tmp = True
tmp = False
tmp = ''  # False
tmp = ' '  # True
tmp = []  # False
tmp = [11]  # True
tmp = ()  # False
tmp = (11,)  # True
tmp = {}  # False
tmp = {'age': 18}  # True
tmp = set()  # False
tmp = {11}  # True


tmp = A()  # True
tmp = None  # False


if tmp:
    print('True')
else:
    print('False')
20.多态:


多态定义:只要是父类能工作的地方,子类都能工作,并且不同子类的执行效果不同


多态的写法


1)定义父类 提供基本方法 2)定义子类 重写父类方法 3)把子类对象传递给调用者,会产生不同的执行效果


多态的好处:


提高调用的灵活性


面向对象三大特性


封装 , 这是定义类的 准则,单个类 根据 职责 将 属性 和 方法 封装 到一个抽象的 类 中,


继承 , 这是设计类的 技巧,父与子 主要体现是实现代码的 重用,相同的代码不需要重复的编写 子类可以在父类功能上进行重写,扩展类的功能


多态, 不同的 子类对象调用 相同的 父类方法,产生 不同的 执行结果,可以增加代码的外部 调用灵活度,


多态以 继承 和 重写 父类方法 为前提 多态是调用方法的技巧,不会影响到类的内部设计


class Dog(object):


    def work(self):
        pass


class ArmyDog(Dog):


    def work(self):
        print('追击敌人')


class DrugDog(Dog):


    def work(self):
        print('追查毒品')




class XiaoTianQuan(Dog):


    def work1(self):
        print('吃月亮')


class Person(object):


    def work_with_dog(self, dog):  # 多态定义:只要是父类能工作的地方,子类都能工作,并且不同子类的执行效果不同
        dog.work()


# 多态的好处:提高调用的灵活性
# 多态的写法:
# 1.定义父类,提供基本方法
# 2.定义子类,重写父类方法
# 3.把子类对象传递给调用者,会产生不同的执行效果


army = ArmyDog()
drug = DrugDog()
xiaotian = XiaoTianQuan()


p = Person()
p.work_with_dog(army)
p.work_with_dog(drug)
p.work_with_dog(xiaotian)
21.异常与捕获异常:


异常:让程序崩溃的代码 捕获异常: try...except...


try:
    print('try start')
    print(a)
    print('try end')  # 即使捕捉了异常,异常之后的代码也不会执行


except:  # 当出现异常的时候会执行 except
    print('捕捉到异常,正在进行修复')


1)捕获多个异常和指定异常


根据工作经验和 解释器给出的异常名


多个异常捕捉 用同样方法解决 可以用元组 里写异常名


except (NameError, FileNotFoundError):  # 捕捉多个指定异常,except (异常名称1, 异常名称2, ...)
    print('捕捉到资源不存在异常,正在进行修复')


except ValueError:
    print('类型转换发生异常,正在进行修复')
2)捕捉任意异常


查找父类:__mro__方法,能通过查找顺序来查找一个类的父类


except Exception:是py里大部分异常处理的父类 (可以设置别名) except 后面不写 :则是就收所有的异常,(不可以使用别名)


except Exception:  # Exception 是Python里大部分异常的父类,可以捕捉绝大部分的异常
    print('Exception 捕捉到异常')


except:  # except 后不指定异常,可以捕捉任意异常
    print('捕捉到未知异常,正在修复~~')
3)异常的别名:


except 异常名 as 变量: 打印变量 时就会打印出异常信息。 except (多个异常名称)as 变量: 打印变量只会打印出一个异常信息,(因为一次只捕获一次)


except ValueError as exp:  # except 异常名称 as 别名
    print('类型转换发生异常,正在进行修复, exp=', exp)


except (NameError, FileNotFoundError) as exp:  # except (异常1,异常2,..) as 别名
    print('捕捉到资源不存在异常,正在进行修复, exp=', exp)


except Exception as exp:  # Exception 可以设置别名
    print('Exception 捕捉到异常, exp=', exp)


except:  # except 不能设置别名
    print('捕捉到未知异常,正在修复~~')
4)try ...except ... else ... finally.


else :在没有异常时会执行 finally 无论有没有异常都会执行


except ValueError as exp:
    print('类型转换发生异常,正在进行修复, exp=', exp)


else:
    print('else 当没有异常发生时才会执行')


finally:
    print('finally 不管有没有异常都会执行')
5)异常的传递:


被调用的函数发生异常,会把异常传回调用者。


def func1():
    print('func1 --- start')
    x = 1 / 0  # 被调用的函数发生异常,会把异常传递给调用者
    print('func1 --- end')




def func2():
    print('func2 --- start')
    try:
        func1()
    except Exception:
        print('捕捉到异常')
    print('func2 --- end')


func2()
print('程序结束')
6)自定义异常:


自定义异常必须继承Exception
通过raise 执行异常
李龙 21:31:49
类与对象


1.定义类:


类是具有相同属性和行为的事物的统称


class Cat:
    """
    函数体
    """
    pass
2.创建对象:


某一个具体事物的存在 现实生活中看得见 摸得着


对象名1 = 类名()


对象名2 = 类名()
多个对象之间互不干扰 相互独立


3.为对象添加属性


tom = Cat()
tom.name = '汤姆'
print(tom.name)
4.在方法内获取对象的属性:


class Cat:
    """
    函数体
    """
    def eat(self):
        print('%s在喝水' % tom.name)
tom = Cat()
tom.name = '汤姆'
tom.eat()
print(tom.name)
5.self的作用


self 代表了当前调用方法的对象


6.__init__的使用


使用: 方法在创建对象后执行 一般用来初始化对象的共有属性


__init__传参的作用: 可以在self 后面定义需要用到的参数 init需要的参数,在创建对象时传递


def __init__(self,new_name):
        """
        魔法方法:在恰当的时机会自动执行的方法
        
        """
        print('init 执行了')
        self.name = new_name
class Cat:


    def __init__(self, new_name):
        self.name = new_name
        
xiaobai = Cat('伊丽莎白')


7.全局变量与属性的区别:


全局变量 在程序中只能有一个 self引用了一个对象,添加的各个属性在各个对象间独立存在


8.__str__方法的使用:


__str__方法会在打印对象时执行,一般用于返回对象的描述信息
__str__方法必须有返回值,并且返回值必须是字符串类型
def __str__(self):
        # print('str 执行了')
        return '我是 %s' % self.name
        ```


###### 9.__del__方法的使用:


__del__方法当对象被销毁时执行
__del__方法一般用于验证对象是否被销毁以及释放没有用的资源(关闭文件等)


接面向对象二10.私有属性:


属性前面加两个下划线,只有定义属性的类才能用,


如果在类之外为私有属性赋值,产生一个新的属性。


class Animal(object):
    def __init__(self, ):
        self.__age = 18  #  定义私有属性
11.私有方法:


只能在 类内部用的方法,方法前面加双下划线


私有权限:在属性名和方法名 前面 加上两个下划线 __ 类的私有属性 和 私有方法,都不能通过对象直接访问,但是可以在本类内部访问; 类的私有属性 和 私有方法,都不会被子类继承,子类也无法访问; 私有属性 和 私有方法 往往用来处理类的内部事情,不通过对象处理,起到安全作用。


12.父类,子类


Python3 没写父类的继承,就默认继承 object


Python2 如果没写继承 就是经典类,
写明object 是新式类


13.继承


子类可以继承父类的属性和方法


子类如果要使用父类的私有属性,只能通过共有方法


只要创建子类的对象,就默认执行了那个继承过来的__init__方法


(1)单继承


只继承了一个父类
(2)多继承


当父类有同名方法时 一般用强制调用方法指定调用哪一个父类


可以继承多个父类 也继承了父类的所有属性和方法


如果多个父类中有同名的 属性和方法,则默认使用第一个父类的属性和方法(根据类的魔法属性mro的顺序来查找)


is-a has-a 思维工具、逻辑工具


is-a 表示继承关系 is 前面是子类


has-a 表示属性关系 a 后面 是属性


当父类有同名方法时 一般用强制调用方法指定调用哪一个父类


14.重写


定义 父类不满足子类功能 子类写一个与父类同名的方法


重写后的方法,在调用时会调用自己类里面的方法, 变量 是重新赋值 不算重写方法


重写后 仍需要父类同名方法代码里的数据 内容:


1) 父类名.方法名(self,...) (多继承里用


super(子类名,子类对象“self”).父类方法()
super().父类方法() 只能在 py3中使用
上述方法传参: 如果被重写的方法需要接受参数 在子类调用方法时传参 一般父类需要的 参数 子类也要作为形参


15.__new__方法:


创建对象时执行,能够控制一个类是否要创建对象。


cls:表示调用方法时的类对象。


必须要 return后 才能创建对象。


__new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供


__new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类__new__出来的实例,或者直接是object的__new__出来的实例


    def __new__(cls, *args, **kwargs):
        obj = object.__new__(cls)
        return obj
__new__方法的传参:


用 不定长参数来接受参数 创建对象时的参数解释器会给__new__方法传来,但是__new__方法一般不会使用参数,此时可以使用不定长参数来接收


16. 类对象 与 类属性 实例对象 与 实例属性


类对象:


遇到class关键字 解释器会自动创建类对象


类属性:


当前类的所有实例对象共享一个类属性。


修改类属性:


类名.类属性 = 类属性


实例对象:


类创建出的对象,真实存在的东西


实例属性:


彼此相互独立,互补干扰。


17.实例方法 与 类方法、静态方法


实例方法:


方法的第一个参数是实例对象,叫实例方法


类方法


方法上写@classmethod 方法的第一个参数 一定是接受类对象的


静态方法:


方法上面加上 @staticmethod 方法不接受任何强制性参数


方法的调用 实例方法: 对象名.实例方法()


类方法: 类名.类方法()


静态方法:类名.静态方法()


class Person(object):


    __num = 0  # 私有类属性


    def __init__(self, name):
        self.name = name
        Person.__num += 1


    def drink(self):  # 方法的第一个参数接收的是实例对象,叫做实例方法
        print('%s 能喝' % self.name)


    @classmethod  # 装饰器
    def get_num(cls):  # 类方法,在方法上写一个 @classmethod ,方法的第一个参数必定是类对象
        print('get_num,cls=',cls)
        return cls.__num


    @staticmethod
    def add2num(a, b):  # 静态方法,在方法上写一个 @staticmethod ,方法不需要接收任何强制性的参数
        return a+b


zs = Person('张三')
# zs.drink()


# print(Person.get_num())  # 类方法调用,类名.类方法()
print(Person.add2num(11,22))  # 静态方法调用,类名.静态方法()
18.单例模式:


设计模式:


* 设计模式是由技术大牛们总结出来的一套代码模板
* 即使是技术不够强大的程序员,只要按照模板的套路来写,就可以解决比较复杂的问题
定义:一个类只允许创建一个对象 intance = None


    def __new__(cls, *args, **kwargs):
        # if cls.instance == None:  # 当类属性引用为 None 才创建新对象
        if not cls.instance:  # 当类属性引用为 None 才创建新对象
            cls.instance = object.__new__(cls)
        return cls.instance
19.if判断


class A(object):
    pass


tmp = 0  # False
tmp = 1  # True
tmp = -1  # True
tmp = 0.0  # False
tmp = 0.2  # True
tmp = True
tmp = False
tmp = ''  # False
tmp = ' '  # True
tmp = []  # False
tmp = [11]  # True
tmp = ()  # False
tmp = (11,)  # True
tmp = {}  # False
tmp = {'age': 18}  # True
tmp = set()  # False
tmp = {11}  # True


tmp = A()  # True
tmp = None  # False


if tmp:
    print('True')
else:
    print('False')
20.多态:


多态定义:只要是父类能工作的地方,子类都能工作,并且不同子类的执行效果不同


多态的写法


1)定义父类 提供基本方法 2)定义子类 重写父类方法 3)把子类对象传递给调用者,会产生不同的执行效果


多态的好处:


提高调用的灵活性


面向对象三大特性


封装 , 这是定义类的 准则,单个类 根据 职责 将 属性 和 方法 封装 到一个抽象的 类 中,


继承 , 这是设计类的 技巧,父与子 主要体现是实现代码的 重用,相同的代码不需要重复的编写 子类可以在父类功能上进行重写,扩展类的功能


多态, 不同的 子类对象调用 相同的 父类方法,产生 不同的 执行结果,可以增加代码的外部 调用灵活度,


多态以 继承 和 重写 父类方法 为前提 多态是调用方法的技巧,不会影响到类的内部设计


class Dog(object):


    def work(self):
        pass


class ArmyDog(Dog):


    def work(self):
        print('追击敌人')


class DrugDog(Dog):


    def work(self):
        print('追查毒品')




class XiaoTianQuan(Dog):


    def work1(self):
        print('吃月亮')


class Person(object):


    def work_with_dog(self, dog):  # 多态定义:只要是父类能工作的地方,子类都能工作,并且不同子类的执行效果不同
        dog.work()


# 多态的好处:提高调用的灵活性
# 多态的写法:
# 1.定义父类,提供基本方法
# 2.定义子类,重写父类方法
# 3.把子类对象传递给调用者,会产生不同的执行效果


army = ArmyDog()
drug = DrugDog()
xiaotian = XiaoTianQuan()


p = Person()
p.work_with_dog(army)
p.work_with_dog(drug)
p.work_with_dog(xiaotian)
21.异常与捕获异常:


异常:让程序崩溃的代码 捕获异常: try...except...


try:
    print('try start')
    print(a)
    print('try end')  # 即使捕捉了异常,异常之后的代码也不会执行


except:  # 当出现异常的时候会执行 except
    print('捕捉到异常,正在进行修复')


1)捕获多个异常和指定异常


根据工作经验和 解释器给出的异常名


多个异常捕捉 用同样方法解决 可以用元组 里写异常名


except (NameError, FileNotFoundError):  # 捕捉多个指定异常,except (异常名称1, 异常名称2, ...)
    print('捕捉到资源不存在异常,正在进行修复')


except ValueError:
    print('类型转换发生异常,正在进行修复')
2)捕捉任意异常


查找父类:__mro__方法,能通过查找顺序来查找一个类的父类


except Exception:是py里大部分异常处理的父类 (可以设置别名) except 后面不写 :则是就收所有的异常,(不可以使用别名)


except Exception:  # Exception 是Python里大部分异常的父类,可以捕捉绝大部分的异常
    print('Exception 捕捉到异常')


except:  # except 后不指定异常,可以捕捉任意异常
    print('捕捉到未知异常,正在修复~~')
3)异常的别名:


except 异常名 as 变量: 打印变量 时就会打印出异常信息。 except (多个异常名称)as 变量: 打印变量只会打印出一个异常信息,(因为一次只捕获一次)


except ValueError as exp:  # except 异常名称 as 别名
    print('类型转换发生异常,正在进行修复, exp=', exp)


except (NameError, FileNotFoundError) as exp:  # except (异常1,异常2,..) as 别名
    print('捕捉到资源不存在异常,正在进行修复, exp=', exp)


except Exception as exp:  # Exception 可以设置别名
    print('Exception 捕捉到异常, exp=', exp)


except:  # except 不能设置别名
    print('捕捉到未知异常,正在修复~~')
4)try ...except ... else ... finally.


else :在没有异常时会执行 finally 无论有没有异常都会执行


except ValueError as exp:
    print('类型转换发生异常,正在进行修复, exp=', exp)


else:
    print('else 当没有异常发生时才会执行')


finally:
    print('finally 不管有没有异常都会执行')
5)异常的传递:


被调用的函数发生异常,会把异常传回调用者。


def func1():
    print('func1 --- start')
    x = 1 / 0  # 被调用的函数发生异常,会把异常传递给调用者
    print('func1 --- end')




def func2():
    print('func2 --- start')
    try:
        func1()
    except Exception:
        print('捕捉到异常')
    print('func2 --- end')


func2()
print('程序结束')
6)自定义异常:


自定义异常必须继承Exception
通过raise 执行异常


class MyError(Exception):


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


    def __str__(self):  # __str__ 方法返回的数据,就是异常的描述信息
        return '年龄不能小于 0,您输入的是 %d' % self.age




try:
    age = int(input('请输入您的年龄:'


class MyError(Exception):


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


    def __str__(self):  # __str__ 方法返回的数据,就是异常的描述信息
        return '年龄不能小于 0,您输入的是 %d' % self.age




try:
    age = int(input('请输入您的年龄:'



6 个回复

正序浏览
回复 使用道具 举报
回复 使用道具 举报
加油加油
回复 使用道具 举报
回复 使用道具 举报
可以说很专业了
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马