学习python的第四天(类,继承)

北慕城南 提交于 2019-11-29 04:58:26

每日小酌:这世界上,最富有的人,是跌倒最多的人;最勇敢的人,是每次跌倒都能站起来的人;最成功的人,是那些每次跌倒,不单能站起来,还能够坚持走下去的人。

开始学习

定义类关键字 class

init 是一个特殊的方法用于在创建对象时进行初始化操作不用的时候可写可不写

拿例题说事1

class tyler(object):
    # 类还可以不写object(默认就继承了object)创建 class tyler:  
    def __init__ (self,name,age):
        self.name = name
        self.age = age
    def study(self,course):
        self.course = course
        print('%s正在学习%s。'%(self.name,self.course))
    def watch(self):
        if self.age <18:
            print('%s只能看《熊出没》'%self.name)
        else:
            print('%s只能看《动作片》'%self.name)
if __name__ == "__main__":
    stu = tyler('asd',19)  #这里的()走的是初始化__init__函数,此函数有两个参数,所以要赋值
    stu.watch() # 调用类中的函数

这里也可以用main()函数调用

def main():
   #创建学生对象并指定姓名和年龄
    stu1 = tyler('琉璃', 38)
    # 给对象发study消息
    stu1.study('Pytho')
    # 给对象发watch_av消息
    stu1.watch()
    stu2 = tyler('玻璃门', 15)
    stu2.study('看书')
    stu2.watch()
if __name__ == '__main__':
    main()


拿例题说事2

class student:
    # 当你的类有一些公用变量的时候,你就可以初始化。
    def __init__(self,name):
        # 再类中,一切的变量和函数都要印记(self)
        self.name = name
    def def1(self,num):
        self.num = num
        print(self.num)
        print(self.name)
    def def2(self):
        print(self.name)
        print(self.num)
if __name__ == "__main__":
    stu = student('李四')  #()走的是初始化函数
    stu.def1(100)
    stu.def2()

练习

读取TXT文件,并输出里面的大写字母有多少个

class tyler(object):
    def __init__(self):
        self.count = 0
        pass
    def reada(self):
        with open ('C:/Users\\a\\Desktop\\ds.txt',mode='r') as f:
            lines = f.read()
            for line in lines:
                new_line = line.strip('\n')
                # print(new_line,end="")
                for i in new_line:
                    if i.isupper():
                        self.count +=1
        print('大写字母个数为%d'%self.count)
        
if __name__ == "__main__":
    T = tyler()
    T.reada()

访问可见性的问题

在类中可以调用变量,函数,在函数中也可调用函数
私有变量,变量名前加‘__’
如果非要使用私有变量,那么可以使用dir(class())去查看他的真正名称
私有变量或函数,在类内部可以直接调用

如果你想体现一个变量或函数,可以使用‘_’

拿题说事

class test:
    def __init__(self,foo):
        self.__foo = foo #私有变量
    def __bar(self):
        print(self.__foo)
        print('__bar')
if __name__ == "__main__":
    ts = test("hello")          #AttributeError: 'test' object has no attribute '__bar'
    ts._test__bar()            #用私有的全名称来调用


@porperty装饰器

#将函数变成了一个属性 修改器和访问器的函数名要相同
#如果想要访问私有属性可以通过属性的getter(访问器)和setter(修改器)方法进行对应的操作

这时就可以考虑使用@property包装器来包装getter和setter方法

#说白了就是通过装饰器可以将私有的变量修改

class person (object):
    def __init__(self,name,age):
        self._name = name
        self._age = age
    #访问器  - getter方法
    @property
    def name(self):
        return self._name
    #访问器  - getter方法
    @property
    def age (self):
        return self._age
    #修改器-- setter方法
    @age.setter
    def age(self,age):
        self._age = age
    def play(self):
        if self._age <16:
            print('%s正在玩游戏'%self._name)
        else:
            print('%s正在看书'%self._name)
if __name__ == "__main__":
    per = person('张三',45)
    per.play()
    per.age = 10     #可修改私有变量
    per.play()

slots ,魔法

如果我们需要限定自定义类型的对象只能绑定某些属性,可以通过在类中定义__slots__变量来进行限定。需要注意的是__slots__的限定只对当前类的对象生效,对子类并不起任何作用。

class person (object):
    #限定person对象只能绑定_name,_age,_gender属性
    __slots__ = ('_name','_age','_gender')
    def __init__(self,name,age):
        self._name = name
        self._age = age
    @property
    def name(self,name):
        return self._name
    @property
    def age(self):
        return self._age
    @age.setter
    def age(self,age):
        self._age = age
    def play(self):
        if self._age <16:
            print('%s正在玩飞行棋.' % self._name)
        else:
            print('%s正在玩斗地主.' % self._name)
if __name__ == "__main__":
    per = person('王二麻子',23)
    per.play()
    per._gender = '男'

静态方法和类方法

#用@staticmethod
from math import sqrt
class calss_a(object):
    def __init__(self, a, b, c):
        self._a = a
        self._b = b
        self._c = c
    @staticmethod
    def is_valid(a, b, c):
        return a + b > c and b + c > a and a + c > b
    def perimeter(self):
        return self._a + self._b + self._c
    def area(self):
        half = self.perimeter() / 2
        return sqrt(half * (half - self._a) *
                    (half - self._b) * (half - self._c)


def main():
    a, b, c = 3, 4, 5
    # 静态方法和类方法都是通过给类发消息来调用的
    if calss_a.is_valid(a, b, c):
        t = calss_a(a, b, c)
        print(t.perimeter())
        # 也可以通过给类发消息来调用对象方法但是要传入接收消息的对象作为参数
        # print(Triangle.perimeter(t))
        print(t.area())
        # print(Triangle.area(t))
    else:
        print('无法构成三角形.')

if __name__ == '__main__':
    main()


继承

子类除了继承父类提供的属性和方法,还可以定义自己特有的属性和方法,所以子类比父类拥有的更多的能力


class person (object):
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def play(self):
        print('%s正在愉快的玩耍.' % self.name)
    def watch(self):
        if self.age >= 18:
            print('%s正在观看爱情动作片.' % self.name)
        else:
            print('%s只能观看《熊出没》.' % self.name)

class student(person):
    def __init__(self, name, age, grade):
        super().__init__(name, age)
        self._grade = grade
    @property
    def grade(self):
        return self._grade
    @grade.setter
    def grade(self, grade):
        self._grade = grade
    def study(self, course):
        print('%s的%s正在学习%s.' % (self._grade, self.name, course))

if __name__ == "__main__":
    stu = student('大牛',15,'大三')
    stu.study('数学')

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!