- 命名类名的时候 大驼峰每个单词首字母大写
- python中一个东西吃饭想鸭子,叫的像鸭子,我们就认为他是一只鸭子
- 我们通常吧具有相同特性的属性或者方法抽象成一个方法 例如动物类可以抽象出 吃 睡 的方法
-
封装
把具有相同属性的事务放到一个类里,外面的对象可以调用我实现功能,不需要知道我怎么实现优点是代码干净,效率高,代码安全。
对我已经写好的代码不允许别人修改 -
继承
可以通过继承把我封装的方法进行扩展扩写这样就有扩展性了 -
多态
不仅允许子类继承父类方法,还允许子类实现不同的方法,
比如父类 狗类 中叫声统一为汪汪汪
子类可以通过。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()
———————————————————————————————————————
静态方法和类方法
- 类方法只用到了类属性 且形参数约定为cls
- 类方法需要@classmethod 装饰
- 当方法中 需要使用类对象 (如访问私有类属性等)时,定义类方法
类方法一般和类属性配合使用
-
静态方法既不需要传递类对象也不需要传递实例对象
-
静态方法需要@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__)
私有属性的方法和继承
- 子类不能继承私有属性和方法
- 子类必须通过
对象._父类名__私有属性名或者私有方法名() 来调用父类的私有属性或者方法