类名:类的名字 属性:这类事物有什么特征 方法:这类事物有什么行为
面向对象的三个的特性:封装, 继承, 多态
小明今年189岁,身高222米,每天早上跑步,跑完吃饭。
人类:(命名的首字母大写) 属性:age, height 形为:run, eat
? ?? ? ?
类的创建
class Cat():
def eat(self):
print("i am a cat")
def run(self):
print("i am run")
tom = Cat()
tom.name = "tom"
tom.eat()
1.如果没有在class中定义一些属性
可以直接在外面加上,但是不建议还是在类的内部添加,这只是给某一个对象添加了属性(这里是tom)
class Cat():
def eat(self):
print("i am a cat")
print("%s 是一只猫" % self.name)
2.eat(self) 中的self我理解的就是你创建对象的地址,换句话说就是self就是tom对应的地址
init函数
def __init__(self):
print("这是一个初始化方法")
tom = Cat()
init是一个内置函数,写了之后在**最开始创建对象的时候就会调用**这个,这里写了tom = Cat()这个之后就会
调用init函数中写的东西了
self.属性名 = 属性的初始值 就可以了
如self.name = "tom" 那么创建的对象的name都是tom了
如果不想被定死,就传一个name进来
def __init__(self, name):
self.name = name
tom = Cat("大猫") 然后可以打印出来看看
print("tom.name = %s " % tom.name)
删除对象的(自己会调用)
def __del__(self):
str函数
def __str__(self):
return "hello world! wo shi %s " % self.name
tom = Cat("tom")
print(tom)
可以在**打印这个对象**的时候输出的就是str函数里面的东西了(这样就可以直接输出
猫的名字了,不用tom.name),str函数里面的return必须是字符串
is 身份运算符 用于比较两个对象的内存地址是不是一样的,是不是对同一个对象的引用和== 是有区别的
**私有属性、方法:**
在定义属性或者是方法的时候,在属性名字或者是方法名的前面添加**两个下划线**,就是私有属性或者是方法
self.__name = name
但是只要(_类名__属性)就可以了
Python中没有真正的私有
**继承:有传递性**
1.只需要在class dog(animal): 在子类的后面加上括号,括号里面添加父类名字就好了,父类可以
是多个,逗号隔开就好了(要尽量避免多个父类存在同名的方法和属性)如果有只能说第一个是亲爹,
其他是干爹,如果亲爹有就轮不到干爹了
2.父类的方法如果不满足,子类可以重写一个函数,来满足自己的需求,重写可以是不一样的
或者是一样(覆盖)的函数名
3.如果只是拓展,就是父类中写的方法不够,你只是想要在子类中进行补充,还是要先写上你要写的,然后
调用super().xxxx(xxx就是父类中的方法) 或者是父类.xxx(self)也是调用父类(不推荐使用)
4.父类的私有属性是不可以被子类的方法访问的,父类的私有属性可以被父类的共有方法访问
5.mro:method resoulution order 方法搜索顺序
print(xxx.__mro__) xxx就是类名(注意是类名还是对象名)
|