python类

python类

继承

1.什么是继承?
	# 继承就是新建类的一种方式.新建的类我们称为子类或者派生类,被继承的类我们称之为父类或者基类
	# 子类可以使用父类中的属性和方法
	
2.为什么要用继承?
	类解决了对象与对象之间的代码冗余问题
	继承解决了类与类之间的代码冗余问题
	
3.如何使用继承?
	新式类:继承了object类的子子孙孙类都是新式类
	经典类:没有继承了object类的子子孙孙类都是经典类
	
	# 新式类和经典类只有在python2中区分

类的继承

# 以学生选课系统为例
# 父类,公共类
class People():
	school = 'SH'
	
	def __init__(self,name,age,gender)
		self.name = name
		self.age = age
		self.gender = gender
		
# 学生类
class Student(People):

	def __init__(self,name,age,gender,course=None):
		if course is None:
		 	course = []:
		People.__init__(self,name,age,gender)
		self.courses = course
		
	def choose_course(self,course):
		self.courses.append(course)
		print('%s 选课成功 %s' % (self.name,self.courses))
		
stu = Student('ly',19,'male')

# teacher类
class Teacher(People):
	
	def __init__(self,name,age,gender,level):
		self.level = level
		People.__init__(self,name,age,gender)
		
		def score(self,stu_obj,score):
			stu_obj.score = score  # 给学生打分
			print('%s给%s打了%s分' % (self.name,stu_obj.name,score))
			
tea = Teacher('ly',19,'male',10)
print(tea.name)
print(tea.level)

单继承下属性查找

class Foo:
	def f1(self):
		print('Foo.f1')
		
	def f2(self):
		print('Foo.f2')
		'
class Bar(Foo):
	def f1(self):
		print('Bar.f1')
		
obj = Bar()
obj.f2()  # FOO.f2,Bar.f1

# 练习
class Foo:
	def __f1(self):  # _FOO__f1()
		print('Foo.f1')
		
	def f2(self):
		print('Foo.f2')
		self.__f1()  # _Foo__f1()
		
class Bar(Foo):
	def __f1(self):  # _Bar__f1()
		print('Bar.f1')
		
obj = Bar()
obj.f2()  # Foo.f2,Foo.f1

多继承下的属性查找

# 新式类:按照广度优先查找
# 经典类:按照深度优先查找
class A(object):
    def test(self);
        print('from A')

class B(A):
    def test(self):
        print('from B')

class C(A):
    def test(self):
        print('from C')

class D(B):
    def test(self):
        print('from D')

class E(C):
    def test(self):
        print('from E')

class F(D,E):
    def test(self):
        print('from F')

f1 = F()
f1.test()

super()和mro列表

class People():
    school = 'SH'
    
    def __init__(self,name,age,gender):
    self.name = name
    self.age - age
    self.gender = gender

class Teacher():

    def __init__(self,name,age,gender,level):
        self.level= level
        super().__init__(name,age,gender)  # super的使用

# mro列表练习
class A:
    def test(self):
        print('from A.test')
        super().test()

class B:
    def test(self):
        print('from B')

class C(A,B):
    pass

c = C()
c.test()  # from A.test

# mro列表练习2
class B:
    def test(self):
        print('B---->test'):      
 
    def aaa(self):
        print('B---->aaa')

calss A:
    def test(self):
        print('A---->test')
        super().aaa()

class C(A,B):
    def aaa(self):
        print('C---->test')

c = A()  
c.test()  # A---->test,B---->test
print(A.mro()) 

多态与多态性(鸭子类型)

1.什么是多态
水:液态水,固态水,气态水
动物:人,猪,狗,猫...


# 抽象类: 抽象类只能被继承,不能被实例化

class Animal(metaclass=abc.ABCMeta):
    impord abc
    @abc.abstractmethod  # 该方法已经是抽象方法了
    def speak(self):pass

    @abc.abstractmethod
    def login(self):pass

class People(Animal):
    def speak(self):
        print('嗷嗷嗷')

    def login(self):
        pass

class Pig(Animal):
    def speak(self):
        print('哼哼哼')

class Dog(Animal):
    def speak(self):
        print('汪汪汪')

obj = People()
obj.speak()


# 多态练习
class Pig():
    def sprak(self):
        print('哼哼哼')

class Dog():
    def speak(self):
        print('汪汪汪')

class Txt():
    def speak(self):
        print('Txt')

obj = People()
obj = Pig()
obj = Dog()
obj = Txt()

# 多态带来的特性: 在不用考虑对象数据类型的情况下,直接调用对应的函数

def animal(animal):
    return animal.speak()

animal(obj)
animal(obj1)
animal(obj2)
animal(obj3)

# 父类限制子类的行为
class Animal():
    def sprak(self):
        raise Exception('必须实现speak方法')

组合

# 组合就是一个对象拥有一个属性,该属性的值是另一个对象

解决类与类之间的代码冗余问题
    1.继承:满足什么是什么的关系.is-a的关系
    2.组合:没啥关系

继承是一把双刃剑,并不是继承的越多越好

class People:
    school = 'SH'

    def __init__(self,name,age,gender,):
        self.name = name
        self.age = age
        self.gender = gender


class Admin(People):
    pass


class Course():
    def __init__(self,name,period,price,):
        self.name = name
        self.period = period
        self.price = price

python = Course('python','6mon',10000)
linux = Course('linux','5mon',20000)


class Student(People,Course):
    def __init__(self,name,age,gender,course=None):
        if course is None:
            course = []
        self.courses = course
        super().__init__(name,age,gender,)

    def choose_course(self,stu_obj,course):
        stu_obj.courses.append(course)

面向对象的内置函数

1.__init__()
2.__str__()
3.__del__()
4.__enter()
5.__exit__()
6.__call__

class Student():
    school = 'SH'

    # 调用类的时候触发
    def __init__(self,name,age):
    self.name = name
    self.age = age

     def tell(self):
        print('name:%s,age:%s'%(self.name,self.age))

    # 打印对象的时候,自动触发的函数
    # 返回值只能是字符串
    def __str__(self):
        return 'name: %s' $ self.name
        # return 123 不行

    # 1.手动执行del
    # 2.程序执行完毕触发
    def __del__(self):
        print('__del__')
        self.f.close()

    # 对象加括号制自动调用
    def __call__(self,*args,**kwargs):
        print('__call__')

反射(4个方法)

# 对象通过字符串来操作属性

1.getattr
print(getattr(stu,'name1',None))  # stu.name
stu.func()
print(getattr(stu,'func'))
getattr(stu,'func')() # 必须掌握

2.setattr
setattr(stu,'x',123)
print(stu.__dict__)

3.hasattr
print(hasattr(stu,'name'))

4.delattr
delattr(stu,'name')
print(stu.__dict__)
posted @ 2021-12-06 16:43  Zzy的Bk  阅读(78)  评论(0)    收藏  举报