类相当于模板,对象是类的实例。
可以把类理解成做饼干的模子,对象就是用模子做出的饼干。
我们定义一个class的时候,我们实际上就定义了一种数据类型,我们定义的数据类型和python自带的数据类型,比如str,list,dict没什么两样
---------------------------------------------
类变量:
1.在实例化对象中是公用的。
2.定义在类中且在函数体之外。
3.通常不作为实例变量使用。
4.ClassName.bianliang来访问
--------------------------------------------------
实例变量:
1.定义在方法中的变量。
2.只作用于当前实例的类。
3.self.bianliang来访问
实例化:创建一个类的实例,类的具体对象。
--------------------------------------------------------
方法:
类中定义的函数。
和普通的函数相比,在类中定义的函数只有一点不同,就是第一个参数永远是实例变量self
并且,调用时,不用传递该参数。
除此之外,类的方法和普通函数没有什么区别,所以,你仍然可以用默认参数、可变参数和关键字参数。
方法重写,继承,多态。
------------------------------------------------------
创建类:
class ClassName:
'xxxxx' //类文档字符串,可通过ClassName.__doc__查看
class_suite
-------------------------------------------------------
构造方法(初始化方法):
当创建这个类的实例时就会调用该方法,self代表类的实例,self在定义类的方法时是必须有的。
创建类的实例的时候,就不能传入空的参数,必须传入与__init__方法匹配的参数,但是self不需要传,init只能有一个
__init__()方法是可选的,如果不提供,python会给出默认的__init__方法
def __init__(self,name,score):
self.name=name
self.score=score
可以把要先初始化的属性放到这个函数里面
name和score为类的实例变量,用 ‘对象名.实例变量名’ 访问
-------------------------------------------------------
类的实例化:
对象名=类名()
emp=Employee("zara",2000) //emp是Employee类型
判断一个变量是否是某个类型可以用isinstance()判断: isinstance(emp,Employee),返回true
-----------------------------------------------------------
访问属性:
getattr(obj, name[, default]) : 访问对象的属性。
hasattr(obj,name) : 检查是否存在一个属性。
setattr(obj,name,value) : 设置一个属性。如果属性不存在,会创建一个新属性。
delattr(obj, name) : 删除属性。
----------------------------------------------------------
内置类属性:
__dict__ :类的属性
__doc__ :类的文档字符串
__name__:类名
__module__:类定义所在的模块(类的全名是'__main__.className',如果类位于一个导入模块mymod中,那么className.__module__ 等于 mymod)
__bases__:类的所有父类构成元素(包含了一个由所有父类组成的元组)
-------------------------------------------------------
类的继承:
所有类都会继承Object类
class Son(Parent):
xxxx
1.父类的构造(__init__())方法不会被自动调用
2.class C(A,B): //继承类A和B
3.子类实例可以调用父类方法
4.issubclass(sub,sup) 尔函数判断一个类是另一个类的子类或者子孙类
5.isinstance(obj, Class) 布尔函数如果obj是Class类的实例对象或者是一个Class子类的实例对象则返回true
//父类
class Person(object): def __init__(self, name, gender): self.name = name self.gender = gender
//子类
class Student(Person): def __init__(self, name, gender, score): //子类需要自己定义初始化函数,父类的构造(__init__())方法不会被自动调用 super(Student, self).__init__(name, gender) //name和gender调用父类的,一定要用 super(Student, self).__init__(name, gender) 去初始化父类,否则,继承自 Person 的 Student 将没有 name 和 gender。 self.score = score
-----------------------------------------------------
方法的重写:
----------------------------------------------------
类的私有属性:
__private_attrs: 只能在类内部方法中通过self.__private_attrs使用
例子:__secretCount = 0 # 私有变量
类的私有方法:
__private_method:只能在类内部调用self.__private_method
protected变量:
_foo: 只能允许其本身与子类进行访问,不能用于 from module import *
------------------------------------------------
多态存在的必要条件:
1.要有继承
2.要有重写
Dog类继承Animal类,Dog类产生一个实例变量d,d的数据类型是Dog,也是Animal,当d有某些行为(理解成使用类的方法)时,优先使用Dog类方法。
输出结果:A B C A E
没有谁规定test方法是接收的参数是什么类型的。test方法只规定,接收一个参数,调用这个参数的prt方法。
在运行的时候如果这个参数有prt方法,python就执行,如果没有,python就报错,因为abcde都有prt方法,而f没有,所以得到了上边得结果,这就是python的运行方式。
--------------------------------------------------------
析构函数:
__del__(self):
xxxx
当使用del删除对象时,会调用他本身的析构函数,另外当对象在某个作用域中调用完毕,在跳出其作用域的同时析构函数也会被调用一次,这样可以用来释放内存空间。
__del__()也是可选的,如果不提供,则python会在后台提供默认析构函数
显式的调用析构函数,可以使用del关键字,例如:del 对象名
----------------------------------------------------------