1、类的语法

# 类的语法

# 定义类
class Dog(object):

    # 类的属性或者类变量,一般是公共属性,存在类的内存空间,所有实例对象共享
    d_type = "京巴"

    #初始化方法, 构造方法,实例化类的时候进行的初始化操作,这里定义的变量要实例属性
    def __init__(self,name: str,age: int,):
        print("初始化方法",name,age)


    # 实例方法
    def sayhi(self):
        print("hello my name is dog,my type is {dt}".format(dt = self.d_type))


# 实例化类,生成类的对象
d1 = Dog("d1",2)
d2 = Dog("d2",3)

print(d1.d_type,id(d1.d_type))
print(d2.d_type,id(d2.d_type))

Dog.d_type = "藏獒"
print(d1.d_type,id(d1.d_type))
print(d2.d_type,id(d2.d_type))


d1.sayhi()

d2.sayhi()

 

2、实例方法的self到底是什么?

# 类的语法

# 定义类
class Dog(object):
    # 类的属性或者类变量,一般是公共属性,存在类的内存空间,所有实例对象共享该内存空间
    d_type = "京巴"

    # 构造方法,实例化类的时候进行的初始化操作,这里的变量存在于对象的内存空间中,对象之间是隔离的
    def __init__(self,name: str,age: int):
        self.name = name
        self.age = age



    # 实例方法
    def sayhi(self):
        print("hello my name is dog,my type is {dt}".format(dt=self.d_type))
        print("我的名字是{name},我的年龄是{age}".format(name = self.name,age = str(self.age)))
        print(self) #我们通过打印的数值就知道self其实就是对象本身


d1 = Dog("name1",1)
d2 = Dog("name2",2)

d1.sayhi()
d2.sayhi()

print(d1)

 

3、类的属性

class Dog(object):
    # 类的属性或者类变量,一般是公共属性,存在类的内存空间,所有实例对象共享该内存空间
    d_type = "京巴"

    # 构造方法,实例化类的时候进行的初始化操作,这里的变量存在于对象的内存空间中,对象之间是隔离的
    def __init__(self,name: str,age: int):
        self.name = name
        self.age = age



d1 = Dog("d1",2)
d2 = Dog("d2",2)
# 两种方式可以调用类的属性,通过类和实例都可以调用

print(Dog.d_type)
print(d1.d_type)
d1.d_type = "藏獒"

print(d1.d_type)  #相当于创建了一个实例变量
print(Dog.d_type)  #当然不会影响这一部步骤的结果输出
print(d2.d_type)   #当然不会影响这一步骤的结果输出,d2还是打印的类的属性的值




# 实例属性只能通过实例来调用
print(d1.age)

# 类不能调用实例属性
# print(Dog.name)
# 会抛错

 

4、类的继承

# 继承

class Animal(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def eate(self):
        print("eating")


class Persion(Animal):

    def __init__(self,name,age,address):
        Animal.__init__(self,name,age)    #执行父类的构造方法
        self.address = address            #执行子类的构造方法


    # 子类可以自定义自己的方法,这个方法只能被这个子类和这个子类的子类实例调用
    def talk(self):
        print("talking")

    # 子类当然可以重新父类的方法,子类如果调用eate方法,则优先调用自己重新的eate方法
    def eate(self):
        print("人在慢慢的吃饭")

class Dog(Animal):

    def killrabbit(self):
        print("killrabbit")



p1 = Persion("P1",23,"深圳")



p1.eate()
p1.talk()

d1 = Dog("d1",23)
d1.eate()
d1.killrabbit()

  

5、类的多继承

# 多继承


class Shenxian():
    def __init__(self,name):
        self.name = name
        print("Shenxian的构造方法")

    def fly(self):
        print("Shenxian,fly")

    def talk(self):
        print("shenxian talk")

class Monkey():
    def __init__(self,name,high):
        self.name = name
        self.high = high
        print("monkey的构造方法")

    def Monkey(self):
        print("Monkey,Monkey")

    def talk(self):
        print("Monkey talk")

class King(Shenxian,Monkey):
    def __init__(self,name,high,age):
        Shenxian.__init__(self,name)
        Monkey.__init__(self,name,high)

        self.age = age



k1 = King("k1","dd","33")

k1.talk()


# 多继承的继承顺序

# 按顺序从左到右继承
# 广度优先(python2是深度优先)

 

6、类的封装

# 封装

# 防止该类的代码和变量被外部随意访问

class Persion(object):
    def __init__(self,name):
        self.name = name

        self.__life = 100    #变量前面加2个下划线,外面就不能直接访问了,但是内部可以使用

    def getlife(self):       #可以通过方法来返回私有属性,让外部获取私有属性的值,但是不能修改
        return self.__life


    def __attck(self):         #私有方法外部也不能访问
        self.__life = self.__life - 10

    def bite(self):
        print(self.__life)

p1 = Persion("name")

# 如果外部想访问的话 可以这样搞
#
# 实例名._类名__方法名

r = p1._Persion__life
print(r)

 

7、类的多态

# 多态


# 一个对象会有多种表现形式,多个对象共用一个接口,又表现出不一样的形态


class Dog():
    def sound(self):
        print("汪汪汪")

class Cat():
    def sound(self):
        print("喵喵喵")

def make_sound(obj):
    obj.sound()


d1 = Dog()
c1 = Cat()

# 同一个接口,不同的表现形式

make_sound(d1)
make_sound(c1)

 

8、classmethod装饰器

class Dog(object):
    def __init__(self):
        pass


    @classmethod
    #通过classmethod装饰器实现,被classmethod装饰后的方法称为类方法,类方法和普通方法
    # 的区别在于类方法只能访问类变量,不能访问实例变量
    def test(self):
        #这个self其实是类本身,而不是具体的实例,我们通过打印可以知道
        print(self)

d = Dog()
d.test()
# <class '__main__.Dog'>

print(Dog)
# <class '__main__.Dog'>

 

9、staticmethod装饰器

class Dog(object):
    name = 1
    def __init__(self):
        pass
    #通过staticmethod装饰器实现,被staticmethod装饰后的方法称为静态方法,静态方法和普通方法
    # 的区别在于静态方法不能访问类的属性,也不能实例的属性

    # 静态方法隔离了静态方法和类和实例的任何方法和属性

    @staticmethod
    def test():
        print("123",Dog.name)


d = Dog()

d.test()

 

10、propty装饰器

class Dog(object):
    name = 1
    def __init__(self):
        pass

    # property把一个方法变成一个静态的属性

    @property
    def test(self):
        if Dog.name == 1:
            print("123",Dog.name)
        else:
            print("456", Dog.name)

    @test.setter
    def test(self,status):
        pass

    @test.deleter
    def test(self):
        pass

d1 = Dog()

d1.test

d2 = Dog()
Dog.name = 2
d2.test
# 被property装饰的方法只能这样当作一个变量去执行,不需要加括号,如果一个变量的值比较负责,有一些列的逻辑
# 被property装饰的方法只能这样当作一个变量去执行,虽然看起来是个变量,但是实际是不能赋值的

# d2.test = 2
# AttributeError: can't set attribute


# 如果想对一个方法做赋值,在需要使用 下面的方法
# 通过也可以实现删除

# 通过property把一个方法变成属性,通过@test.setter方法可以对test这个方法的进行赋值,通过@test.deleter
# 方法可以对test这个属性进行删除,此处的函数名称必须是一样的


@property
def test(self):
    if Dog.name == 1:
        print("123", Dog.name)
    else:
        print("456", Dog.name)


@test.setter
def test(self, status):
    pass


@test.deleter
def test(self):
    pass

 

11、反射

# 反射:可以通过字符串的形式来操作一个对象的属性

class Dog(object):
    name = 1
    def __init__(self,age,add):
        self.age = age
        self.add = add

    def test(self):
        pass


d = Dog(1,"深圳")






# hasattr 用于判断对象d是否有name这个属性
r1 = hasattr(d,"name")

r2 = hasattr(d,"age")

r3 = hasattr(d,"2b")

r4 = hasattr(d,"test")

print(r1,r2,r3,r4)

# getattr()用于获取对象d的name属性的值

print(getattr(d,"name"))


# setattr()  对对象的属性进行赋值

setattr(d,"age",3)

print(getattr(d,"age"))

# delattr 对对象的属性进行删除

delattr(d,"age")

print(hasattr(d,'age'))

 

12、动态加载模块

# 动态加载模块,热加载

import importlib

try:
    obj = importlib.import_module("test5")
except ModuleNotFoundError as e:
    print(e)

# 通过字符串的方式导入模块

 

13、类的双下划线方法

# 类的双下划线方法

class Dog(object):
    def __init__(self,name):
        self.name = name
    def __len__(self):
        print("执行len方法")
        return 1

    def __hash__(self):
        print("执行hash方法")
        return 1

    def __eq__(self, other):
        print("执行==方法")
        return False

    # 通过字典的方式获取值
    def __getitem__(self, item):
        print("执行d[key]")
        return "__getitem__"

    def __setitem__(self, key, value):
        print("执行d[key] = value")
        self.key = value

    def __delitem__(self, key):
        print("执行del d[key]")

    def __delattr__(self, item):
        print("执行del d.item的时候执行")


    def __str__(self):
        print("执行str(d1)的方法时候执行,或者直接打印对象的时候执行")

    def __del__(self):
        print(self.name,"对象销毁的时候执行,python的对象会自动化销毁的")

    def __call__(self, *args, **kwargs):
        print("对象后加括号执行的方法")




d1 = Dog("d1")
d2 = Dog("d2")
print(len(d1))
#就会执行实例的__len__方法


print(hash(d1))
#就会执行实例的__hash__方法

print(d1 == d2)

print(d1["name"])

d1["age"] = 10

print(d1["age"])

 

14、内置异常

# isinstance()
#
# issubclass()
# 内置异常

try:
    pass

except ValueError as e:
    print("传入一个调用者不期望的值")
except AttributeError as e:
    print("试图访问一个对象没有的属性的错误")
except IOError as e:
    print("输出输入错误,基本上无法打开文件")
except ImportError as e:
    print("无法引入模块或者包")
except IndentationError as e:
    print("代码没有正确对齐的错误")
except IndexError as e:
    print("下标索引超出边界")
except KeyError as e:
    print("试图访问字典中不存在的key值")
except KeyboardInterrupt as e:
    print("ctrl + c被按下")
except NameError as e:
    print("使用一个还未被赋予值的对象")
except SyntaxError as e:
    print("python代码非法,可以认为是语法错误")
except TypeError as e:
    print("传入对象和要求对象的类型不一致")
except FileNotFoundError as e:
    print("文件不存在错误")
except Exception as e:
    print("万能异常,但是只能抓内置的异常类型,自定义的异常这里是抓不到的")

else:
    print("没有出异常会走到这里")

finally:
    print("无论发生异常,还是没有发生异常,都要走到finally这里")

 

15、自定义异常

class MyException(BaseException):
    def __init__(self,msg):
        self.msg = msg

    def __str__(self):
        return self.msg


try:
    for i in range(10):
        if i == 9:
            raise MyException("此时逻辑错误,捕获自定义异常")
        else:
            print(i)
except MyException as e:
    print(e)

 

16、断言

assert  type(1) is int

assert  1 == 2

assert  1 >= 2


# 断言也可以在函数中assert断言参数的类型是否符合我们的要求

 

posted on 2023-10-18 22:53  bainianminguo  阅读(9)  评论(0编辑  收藏  举报