python3的类:
python是一门面向对象的编程语言,学习python下的类,,能帮助自己形成一个基本的面向对象的概念。关于类和实例的理解,一个易懂的栗子就是动物类,我们把动物看做一个类,而狗啊,猫啊,鼠啊的就是这个类的实例。你也完全可以把自己定义的类看成是一个自定义的数据类型,想int、str、list一样,不一样的是这个自定义的数据类型中有一些我们自己编写的功能方法,每一个声明的实例都可以直接调用这里面的方法。
类的属性:
简单的说,类的属性就是在类中定义的变量。而所有的实例,都具有这么一个或多个属性。比如上面的动物类实例狗、猫、鼠。它们都有四只脚、一直尾巴。这就称为属性。属性的引用和和使用,用(.)
class Animal(object): x = 4 #代表实例的脚 y = 1 #代表实例的尾巴 dog = Animal() cat = Animal() mouse = Animal() print("狗的脚数:%d" % dog.x) print("猫的脚数:%d" % cat.x) print("鼠的尾巴数:%d" % mouse.y)
运行结果如下:
类的方法:
__init__方法:
类中离不开实现各种功能的方法,而在定义类后,大部分都会先重写一下__init__方法,它规定了在创建实例时必须传入的一些参数。
class Test1(object): #类的定义 def __init__(self, name, salary): #规定在声明实例时必须传入name、salary这两个参数 self.name = name self.salary = salary def print_f(self): #类的print_f方法 print("姓名:%s" % self.name) print("分数:%d" % self.salary) test1 = Test1("shangsan", 59) #声明一个类的实例,同时传入两个必须的参数,如果参数不够的话,会报错。 test1.print_f() #调用这个实例中的print_f方法
其实你也可以不重写__init__方法,直接把参数放在需要使用的方法中,只是在调用时稍微有点不一样,不需要在参数名前加“self.”,改一下上面的代码:
class Test2(object): #继承object类,后面会说道 def print_f(self, name, salary): #去掉__init__方法,直接把参数放在方法中 print("姓名:%s" % name) print("分数:%d" % salary) #在格式化时,若前面用%d,则必须传入整形 test2 = Test2() #声明实例时不再传入参数,而是在下面调用这个方法时传入所需要的参数。 test2.print_f("lisi", 59) #调用print_f方法
自定义方法:
在类中自定义方法和在外面是一样的,只不过在后面的参数中会多一个self,但这个参数我们是不需要传入的,所在我们完全可以就像在类外那样进行编写。至于这个self,它代表的是类的实例。方法的调用,可以用(.)来进行调用
上面两端代码中的print_f方法就是我们自定义的方法,他的功能是输出name和salary,我们调用时,只需要在实例后面加个(.)然后选择这个方法就可以了
类的继承:
访问父类的属性和方法
类的继承,就是我们在创建一个类时,它可以继承另一个类的属性和方法。新创建的这个类交子类、做继承的类交父类。比如我们先创建了一个animal类,有创建了一个dog类并继承animal类,那animal就是父类,dog就是子类
如果我们想要继承某个类,只需要在创建子类时,在后面的()中填入父类的类名就可以了,如果不需要成其他类,则填入object就行,这是所有类的父类,看下下面的代码
class People(object): #创建父类,继承object类 def __init__(self, name, age): #必须传入name和age self.name = name self.age = age def prient_f(self): print("i am {0},i am {1} years old!!".format(self.name, self.age)) class Student(People): #创建子类,继承People这个父类 pass a = Student("zhangsan", 12) #因为是继承,所以也要传入参数 print("我是子类,我要访问父类的name属性 %s" % a.name) print("我是子类,下面是我访问的父类的print_f方法") a.prient_f()
运行结果如下:
在子类中重写方法
简单改一下上面的代码,如下:
class People(object): def __init__(self, name, age): self.name = name self.age = age def print_f(self): print("i am {0},i am {1} years old!!".format(self.name, self.age)) class Student(People): def print_f(self): #重写print_f方法 print("我是print_f方法,我已经在子类中被重写!") a = Student("zhangsan", 12)
a.print_f()
这时,运行结果就变成了这样
方法的重写,简单的说就是在子类中命名一个与父类完全相同的方法。
类的私有属性
现在我们知道,声明一个实例后,这个实例就可以访问类中的属性,当我们想要一个属性只在类的内部被使用而不能让类外部的实例访问是,这是可以定义私有变量。
只需要在变量名前加两个下划线就行了(__),看下面的代码:
class worker(object): #创建类
name = "wangwu" #公开变量 __age = 12 #私有变量 a = worker() #声明实例 print(a.name) #访问共有变量 print(a.__age) #访问私有变量,会报错
可以看到,当我们尝试访问私有变量时,会出现错误,
对于私有变量,我们可以在类型定义一个方法对它进行返回,当我们想要访问这个属性时,可以通过这个方法。如下。
class worker(object): name = "wangwu" __age = 12 def get__age(self): return self.__age a = worker() print(a.name) print(a.get__age())
把变量放在方法中的好处是,可以对变量的值进行检查,判断是否符合规则