python类

 

类,面向对象一个很重要的载体。类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。

类的定义
类的定义是通过关键字class,class后面紧跟着的是类名,通常是大写开头,紧跟着的是(object),表示该类是从哪个类继承下来的,如果没有合适的继承类,就用object,它是所有类最终都会继承的类。
class Student(object):
    pass
类里面一般都是由很多函数组成,函数的第一个参数默认都是self。
如果需要全局变量就在类的内部直接定义。
类的内部在调用函数或者调用变量的时候,必须self.函数名或者self.变量名,self代表类实例化以后的个体。
class Student(object):
    name = "yangjian"
    def hello(self):
        print("my name is {0}".format(self.name))

 

类的实例化
实例化类的首字母小写作为实例,然后类实例化。
student = Student()
class Student(object):
    name = "yangjian"
    def hello(self):
        print("my name is {0}".format(self.name))
student = Student()

结果:
hello yangjian

 

构造器
类可以起到模板的作用,因此,可以在创建实例的时候,把一些我们认为必须绑定的属性强制写进去。通过一个__init__()方法,在创建实例的时候就把name,score等属性绑定上去。
class Student(object):
    def __init__(self,name,score):
    self.name = name
    self.score = score
student = Student("yangjian",90)
__init__的第一个参数永远是self,表示创建的实例本身,在__init__()方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。为sel绑定了属性之后,在创建实例的时候就不能传入空的参数了,需要传入与__init__()方法相匹配的参数。
构造器,就是类在初始化的时候,首先必须要执行的函数。
class A(object):
    def __init__(self,name):
        self.name = name
        print("init calss A")
    def hello(self):
        print("hello {0}".format(self.name))
a = A("yangjian")
a.hello()
# 结果
init calss A # 初始化的时候执行的
hello yangjian

 

数据封装
在上面的Student类中,每个实例都拥有各自的name和score,可以通过函数来访问这些数据,如打印一个学生的姓名和成绩。既然实例本身就拥有这些数据,我们可以直接在Student类的内部定义访问数据的函数,这样就把数据封装起来了,我们称这样的函数为类的方法。
class Student(object):

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

    def print_score(self):
        print('%s: %s' % (self.name, self.score))
student = Student("yangjian",90)
student.print_score()
结果:
yangjian:90

 

继承
我们在定义一个class的时候,可以从某个现有的class继承,新的class成为子类,被继承的类称为父类。
class Animal(object):
    def __init__(self):
        print("你现在正在初始化一个Animal")
    def run(self):
        print("Animal can run.")
class Bird(Animal):
    def fly(self):
        print("Bird can fly.")
class Cat(Animal):
    def jiao(self):
        print("miao miao miao.")
#animal = Animal()
cat = Cat()
# 结果
你现在正在初始化一个Animal

在上面这个例子中,在实例化Cat这个类的时候,Cat类继承了Animal这个类,所以Cat类会拥有Animal类的所有属性和方法,所以出现的结果是Animal类里面的初始化函数的内容。

 

重写

在子类中,对父类中的发放进行重写。

class Animal(object):
    def __init__(self):
        print("你现在正在初始化一个Animal.")
    def run(self):
        print("Animal can run.")
class Bird(Animal):
    def fly(self):
        print("Bird can fly.")
class Cat(Animal):
    def __init__(self):
        print("我是一只猫.")
    def jiao(self):
        print("miao miao miao.")
animal = Animal()
cat = Cat()
# 结果
你现在正在初始化一个Animal
我是一只猫.

上面这个例子,实例化Cat的时候,先去子类Cat类里面去找初始化函数,找到了就是用Cat类自己的初始化函数,如果Cat类里面没有定义初始化函数,就去父类里面去找。父类中有一个初始化函数和一个run方法,子类对继承自父类的方法进行了重写,于是就有了自己的初始化方法和一个jiao方法。

 

多继承
一个类可以继承多个类。
class Animal(object):
    def __init__(self):
        print("你现在正在初始化一个Animal")
    def run(self):
        print("Animal can run.")
class Bird(Animal):
    def __init__(self):
        print("我是一只鸟.")
    def fly(self):
        print("Bird can fly.")
class Cat(Animal):
    def __init__(self):
        print("我是一只猫.")
    def jiao(self):
        print("miao miao miao.")
class Bianyi(Bird,Cat):  # 多继承,如果父类中都有该方法,那么先继承谁就用谁的方法,即Bird写在前面就先继承Bird
    pass
animal = Animal()
cat = Cat()
binyi = Bianyi()

# 结果
你现在正在初始化一个Animal
我是一只猫.
我是一只鸟.

 

私有变量
有时候我们不希望类里面的变量被外界随便访问,只需要在变量前面加上两个下划线就可以了。
class DbArgs(object):
    # 只有类本身才可以调用
    __host = str("1.1.1.1")
    __port = str()
    __username = str()
    __password = str()
    __dbname = str()

    # 任何人可以调用
    name = "ajing"

    # 只能实例自己调用
    _host = "asdlfjasdl"
    def getHost(self):
        return self.__host

    def setHost(self, host):
        self.__host = host

dbArgs = DbArgs()
print(dbArgs.getHost())  # 类调用getHost()方法
dbArgs.name = "就是要改你,怎么的"  # 这个name不是私有变量,谁都可以调用
print(dbArgs.name)
print(dbArgs._host) # 实例直接调用

结果:
1.1.1.1
就是要改你,怎么的
asdlfjasdl

 

练习

把之前的求阶乘封装成类

class JinCinCount(object):
    def __init__(self, n):
        self.n = n
    def jc(self, n):
        result = 1
        if n == 0:
            return result
        else:
            for i in range(1, n+1):
                result *= i
            return result
    def count(self):
        count = 0
        for i in range(0, int(self.n) + 1):
            count += self.jc(i)
        print("count = {0}".format(count))

def main():
    n = input("Please inpurt a number: ")
    # 实例化类
    jinCinCount = JinCinCount(int(n))
    # 调用类方法
    jinCinCount.count()

if __name__ == "__main__":
    main()

 

posted @ 2018-04-20 20:32  quartzite  阅读(242)  评论(0编辑  收藏  举报