class类个人笔记——python

  • 命名类名的时候 大驼峰每个单词首字母大写
  • python中一个东西吃饭想鸭子,叫的像鸭子,我们就认为他是一只鸭子
  • 我们通常吧具有相同特性的属性或者方法抽象成一个方法 例如动物类可以抽象出 吃 睡 的方法
  1. 封装
    把具有相同属性的事务放到一个类里,外面的对象可以调用我实现功能,不需要知道我怎么实现

    优点是代码干净,效率高,代码安全。
    对我已经写好的代码不允许别人修改

  2. 继承
    可以通过继承把我封装的方法进行扩展扩写这样就有扩展性了

  3. 多态
    不仅允许子类继承父类方法,还允许子类实现不同的方法,
    比如父类 狗类 中叫声统一为汪汪汪
    子类可以通过。super重写成喵喵喵。

magic(魔法)

  • 魔术方法不需要手动调用
  • 名字不要乱改 魔术方法都是定义好的

在这里插入图片描述

1__new__

在我们通过类实例化对象的时候 最先调的魔法就是__new__他会帮我们申请内存地址。 某些时候我们需要手动申请内存可以重写__new__方法

———————————————————————————————————————

2__init__(self)

在实例化对象之后,会自动调用__init__方法把实力话得对象放到__new__申请的内存中去。并且给对象贴上self指向他。 ———————————————————————————————————————

3__del__(cls)

在对象使用完了最后 销毁内存时自动调用 __del__方法 ———————————————————————————————————————

4__str__(self)

在print(对象)的时候自动调用__str__ ———————————————————————————————————————

5__repr__

在print(对象)的时候自动调用__str__ 如果没有重写__str__方法就会去找__repr__方法 两者效果一样 ———————————————————————————————————————

6__call__

__call__ 当出现对象小括号的时候就会自动调用__call__方法 ———————————————————————————————————————

四则运算魔术方法

7__add__

在对象进行+发运算的时候会自动调动__add__方法 ———————————————————————————————————————

8__sub__

在对象进行减(-)法发运算的时候会自动调动__add__方法 ———————————————————————————————————————

9__mul__

在对象进行乘法(*)发运算的时候会自动调动__add__方法 ———————————————————————————————————————

10__truediv__

在对象进行除法(/)发运算的时候会自动调动__add__方法 ———————————————————————————————————————

内置属性

———————————————————————————————————————
1__slots__用于限制实例化的对象属性

写一个类
class Dog(object):
   创建一个狗类
         
         #这里限制准许的属性
    __slots__ = ("name")
    def __init__(self,name,age):
        self.name = name
        self.age  = age

所以这里会报错,如果不在slots里面加age,就没办法传进去 算限制器
d1 = Dog("dog1",18)
print(d1.name)

d1.height = 180
print(d1.height)



———————————————————————————————————————

2__doc__用于查看类的注释信息,可以通过对象.__doc__调用,或者用类名.__doc__调用

print(d1.__doc__)
print(Dog.__doc__)

2__module__用于查看当前对象的所在位置,可以通过对象.__module__调用,或者用类名.__module__调用

print(d1.__module__)
print(Dog.__module__)

2__class__用于查看当前对象是哪个类

print(d1.__class__)

3__dict__用于查看当前对象的属性和值 以字典的方法输出

print(d1.__class__)
———————————————————————————————————————

3__setitem__当用户对象[]自动调用__setitem__方法

class Dog(object):
    """
     我是狗狗类
    """
    def __init__(self,name,age):
        """我爱你"""
        self.name = name
        self.age = age
        
    def __setitem__(self, key, value):
        self.__dict__[key]=value
        这条代码是把赋值的写进对象字典  


d1 = Dog("dog1",18)

print(d1.__dict__)
返回{'name': 'dog1', 'age': 18}

d1[26] = 13   这里会自动调用上面的__setitem__
此时的d1就是self   然后写进d1的字典里

print(d1.__dict__)
返回{'name': 'dog1', 'age': 18, 26: 13}

———————————————————————————————————————

4__getitem__当用户对象[“key”]自动调用__getitem__方法

class Dog(object):
    """
     我是狗狗类
    """
    def __init__(self,name,age):
        """我爱你"""
        self.name = name
        self.age = age



    def __getitem__(self, item):
        return self.__dict__[item]


d1 = Dog("dog1",18)

print(d1["name"])

———————————————————————————————————————

5__delitem__当用户对象[]自动调用__delitem__方法

class Dog(object):
    """
     我是狗狗类
    """
    def __init__(self,name,age):
        """我爱你"""
        self.name = name
        self.age = age

    def __delitem__(self, key):
        del self.__dict__[key]

d1 = Dog("dog1",18)

print(d1.__dict__)

del d1["name"]
print(d1.__dict__)


———————————————————————————————————————

私有属性和方法

class Person(object):
    def __init__(self,name ,age):
        self.name = name
        self.age = age
        self.__tx = 100

    def __qx(self):
        print("你好")

    def fh(self):
        return self.__tx

p1 = Person("y1",15)

print(p1.fh())对私有属性的调用可以通过一个方法暴露私有属性掉
print(p1._Person__tx)也可以通过对象_类名__私有属性名调用

私有方法也是通过这样的方式调用  
p1._Person__qx()

———————————————————————————————————————

静态方法和类方法

  1. 类方法只用到了类属性 且形参数约定为cls
  2. 类方法需要@classmethod 装饰
  3. 当方法中 需要使用类对象 (如访问私有类属性等)时,定义类方法
    类方法一般和类属性配合使用
  • 静态方法既不需要传递类对象也不需要传递实例对象

  • 静态方法需要@staticmethod

  • 当方法中 既不需要使用实例对象(如实例对象,实例属性),也不需要使用类对象 (如类属性、类方法、创建实例等)时,定义静态方法取消不需要的参数传递,有利于 减少不必要的内存占用和性能消耗

class Dog(object):
    money = 1000

    @classmethod      类方法
    def test(cls,a):
        return cls.money+a

    @staticmethod   静态方法
    def test1(a):
        return 3+5+a

d1 = Dog()


print(d1.test(5))

print(d1.test1(2))

继承与多态

  • 封装 函数是对语句的封装 类是对函数和变量的封装
  • 继承 类和类之间可以手动的建立父子关系 父类的属性和方法 子类也可以用
  • 父类也叫基类 子类也叫派生类
  • 多态 是一种技巧可以提升代码的灵活度

类的继承

class Animal(object):   #所有类父类的父类都是object

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

    def sleep(self):
        print(self.name+"睡觉中")

          #这里狗类继承了动物类
class Dog(Animal):
    def eat(self):
        print (self.name+"吃大骨头")


#所以我们实例化的时候会直接调用 父类的__init__方法
d1 = Dog("大黄",7)
d1.eat()
d1.sleep()

类的多继承

  • 类的多继承遵循从左到右的顺序继承 如果找到就不会往后找
  • 可以用类名.__mro__查看类的调用继承顺序优先级最高的是自己没有才会去找继承
class Father(object):

    def left_eye(self):
        print("蓝色左眼")

class Mom(object):
    def rigth_eye(self):
        print("红色右眼")


class My(Father,Mom):
    pass

me = My()  实例化一个我

me.left_eye()      我继承了爸爸的蓝眼睛
me.rigth_eye()     我继承了麻麻的红眼睛

print(My.__mro__)  查看my这个类的 方法属性调用顺序

类的多态

class Father(object):
    def __init__(self):
        self.nose = "大鼻子"

    def left_eye(self):
        print("蓝色左眼")

class Mom(object):
    def rigth_eye(self):
        print("红色右眼")


class My(Father,Mom):

    def __init__(self):
        super(My, self).__init__()通过super重写 init属性   让我的鼻子不继承爸爸的大鼻子   是小鼻子
        self.nose="小鼻子"

    def left_eye(self):
        print("紫色眼睛")

me = My()
print(me.nose)   小鼻子

me.left_eye()    紫色眼睛    因为最先找自己
me.rigth_eye()   红色右眼

print(My.__mro__)

私有属性的方法和继承

  • 子类不能继承私有属性和方法
  • 子类必须通过 对象._父类名__私有属性名或者私有方法名() 来调用父类的私有属性或者方法
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值