python基础班第十三课
上次没讲的property装饰器

class Person():
def __init__(self,name):
self._name = name
@property
def name(self): # get查询方法
print('get方法执行了')
return self._name
p =Person('哈哈')
print(p.name())

class Person():
def __init__(self,name):
self._name = name
@property
def name(self): # get查询方法
print('get方法执行了')
return self._name
p =Person('哈哈')
print(p.name())

此时就可以使用p.name就可以调用属性值了
class Person():
def __init__(self,name):
self._name = name
@property # 不用加括号就可以调用属性了
def name(self): # get查询方法
print('get方法执行了')
return self._name
p =Person('哈哈')
print(p.name)

class Person():
def __init__(self,name):
self._name = name
@property # 不用加括号就可以调用属性了
# 只读属性不能更改
# getter方式用@property来写
def name(self): # get查询方法
print('get方法执行了')
return self._name
p =Person('哈哈')
print(p.name)
p.name ='嘻嘻' #此时重新赋值不能修改了
print(p.name)

class Person():
def __init__(self,name):
self._name = name
@property # 不用加括号就可以调用属性了
# 只读属性不能更改
# getter这里用@property来书写
def name(self): # get查询方法
print('get方法执行了')
return self._name
@name.setter
# setter这里property装饰器用 属性值.setter来书写
def name(self,name):
self._name = name
p =Person('哈哈')
print(p.name)
p.name ='嘻嘻'
print(p.name)

1.继承

继承 多次重复代码会冗余 继承可以避免这种情况出现
# 继承 多次重复代码会冗余 继承可以避免这种情况出现
class Doctor():
name = ''
age = ''
def protect(self):
print('保家卫国')
class Police():
name = ''
age = ''
def protect(self):
print('保家卫国')
class Animal:
def sleep(self):
print('动物会睡觉')
@property
def run(self):
print('动物会跑步')
# 继承书写方式:
class Dog(Animal): # 括号里的类就是当前累的父类(超类)
pass
dog =Dog()
dog.run # 有property就不用括号了

如果不用property装饰器:
class Animal: # 继承的话父类有私有属性(单下划线)子类也有
def sleep(self):
print('动物会睡觉')
def run(self):
print('动物会跑步')
# 继承书写方式:
class Dog(Animal): # 括号里的类就是当前累的父类(超类)
pass
dog =Dog()
dog.run()

# issubclass 检测一个类是不是另一个类的父类
print(issubclass(Dog,Animal))
print(issubclass(Animal,object)) # 任何类嘴大父类都是object类

class Animal(object): # 不写括号,写了括号,写了括号和object都是继承object也都能运行
def sleep(self):
print('动物会睡觉')
def run(self):
print('动物会跑步')
# 继承书写方式: 继承的话父类有私有属性(单下划线)子类也有
class Dog(Animal): # 括号里的类就是当前累的父类(超类)
def run(self):
print('狗会跑步') # 这里有就用这里的,否则就找父类以此类推直到找到object,一直找不到就报错 就叫方法的重写(覆盖)
dog =Dog()
dog.run()

2.方法的重写

class A(object):
def text(self):
print('A')
class B(A):
pass
class C(B):
pass
c =C()
c.text()

class A(object): # 这里也找不到就报错
pass
# def text(self):
# pass
# # print('A')
class B(A):
pass
class C(B):
pass
c =C()
c.text()

class A(object):
def text(self):
print('A')
class B(A): # B 有的话直接用B的方法
def text(self):
print('B')
class C(B):
pass
c =C()
c.text()


super()两种方法书写:(上一级的父类)
1.super().方法()
2.父类.方法(self)
class Dog(Animal): # 括号里的类就是当前累的父类(超类)
def run(self):
super().run() # 用super().方法()可以用回父类的方法
print('狗会跑步')
dog =Dog()
dog.run()
dog.sleep()

class Dog(Animal): # 括号里的类就是当前累的父类(超类)
def run(self):
# super().run() # 用super()可以用回父类的方法
Animal.run(self) # 通常可以用这种 父类.方法(self)
print('狗会跑步')
dog =Dog()
dog.run()
dog.sleep()

3.多重继承 通常要解耦合,尽量避免多重继承

# 多重继承 前面覆盖后面,A B同名方法的时候,采用前面的父类方法 覆盖后来的
class A(object):
def text(self):
print('A')
class B(object):
def text(self):
print('B')
class C(A,B):
pass
c =C()
c.text()

# 多重继承 在多个父类不同名方法的时候都使用,就同时出现多个方法
class A(object):
def text(self):
print('A')
class B(object):
def text(self):
print('B')
def text2(self):
print('text2')
class C(A,B):
pass
c =C()
c.text()
c.text2()

# 查看方法用了什么父类 用__bases__
print(C.__bases__)

4.多态

面向对象
三大特性 封装(getter,setter等) 继承(父类子类) 多态
class A(object):
def __init__(self,name):
self._name = name
@property
def name(self):
return self._name
@name.setter
def name(self,name):
self._name = name
class B(object):
def __init__(self,name):
self._name = name
@property
def name(self):
return self._name
@name.setter
def name(self, name):
self._name = name
a = A('哈哈')
b = B('嘻嘻')
def speak(c):# 当有了共同的方法(name)就都会出现
print('好好学习% s'% c.name)
speak(a)
speak(b)

class Duck(object):
def fly(self):
print('鸭子飞')
class Plane(object):
def fly(self):
print('飞机飞')
def fei(obj): # 有了共同的fly方法就会出现,obj是形参
obj.fly()
duck =Duck()
fei(duck)
plane =Plane()
fei(plane)

5.属性和方法



# 类属性
class A(object):
# 类属性 直接定义在类中的属性
# 类属性可以通过类和类的实例来访问
# 类属性只能通过类的对象(A)来修改,无法通过实例对象(a)来修改
num = 0
a =A()
# 实例属性 只能通过该实例对象(a)来访问,无法通过类属性(A)来访问
# 实例属性的创建:通过该实例对象.属性名来创建:a.num = 10
a.num =10
print(a.num)
print(A.num)

# 类属性
class A(object):
# 类属性 直接定义在类中的属性
# 类属性可以通过类和类的实例来访问
# 类属性只能通过类的对象(A)来修改,无法通过实例对象(a)来修改
# num = 0 没有类属性 print的话会报错
a =A()
# 实例属性 只能通过该实例对象(a)来访问,无法通过类对象(A)来访问
# 实例属性的创建:通过该实例对象.属性名来创建:a.num = 10
a.num =10
print(a.num)
print(A.num)

# 类属性
class A(object):
# 类属性 直接定义在类中的属性
# 类属性可以通过类和类的实例来访问
# 类属性只能通过类的对象(A)来修改,无法通过实例对象(a)来修改
# num = 0
def __init__(self,name): # 这个是实例属性,参照上面的例子
self.name = name
def text(self):
print('text方法')
a =A(10)# 因为有init需要一个name
# 实例属性 只能通过该实例对象(a)来访问,无法通过类属性(A)来访问
# 实例属性的创建:通过该实例对象.属性名来创建:a.num = 10
# a.num =10
# print(a.num)
# print(A.num)
# 实例方法
a.text()
A.text(a)

# 类属性
class A(object):
# 类属性 直接定义在类中的属性
# 类属性可以通过类和类的实例来访问
# 类属性只能通过类的对象(A)来修改,无法通过实例对象(a)来修改
# num = 0
def __init__(self,name): # 这个是实例属性,参照上面的例子
self.name = name
def text(self):
print('text方法')
@classmethod
def text1(cls):
print('text2方法')
a =A(10)# 因为有init需要一个name
# 实例属性 只能通过该实例对象(a)来访问,无法通过类属性(A)来访问
# 实例属性的创建:通过该实例对象.属性名来创建:a.num = 10
# a.num =10
# print(a.num)
# print(A.num)
# 实例方法
a.text()
A.text(a) #类要用到实例方法需要在括号中添加实例对象
# 类方法
# 类方法可以通过该类对象来调用也可以通过该实例对象调用
# cls是第一个参数,也是当前的类对象
a.text1()
A.text1()
# 总结 类当中所拥有的一切,实例对象都能拥有

静态方法
# 类属性
class A(object):
# 类属性 直接定义在类中的属性
# 类属性可以通过类和类的实例来访问
# 类属性只能通过类的对象(A)来修改,无法通过实例对象(a)来修改
# num = 0
def __init__(self,name): # 这个是实例属性,参照上面的例子
self.name = name
def text(self):# 这个也是实例属性
print('text方法')
@classmethod
def text1(cls):
print('text2方法')
@staticmethod
def text2():
print('这是text2静态方法')
a =A(10)# 因为有init需要一个name
# 实例属性 只能通过该实例对象(a)来访问,无法通过类属性(A)来访问
# 实例属性的创建:通过该实例对象.属性名来创建:a.num = 10
# a.num =10
# print(a.num)
# print(A.num)
# 实例方法
a.text()
A.text(a) #类要用到实例方法需要在括号中添加实例对象
# 类方法
# 类方法可以通过该类对象来调用也可以通过该实例对象调用
# cls是第一个参数,也是当前的类对象
a.text1()
A.text1()
# 总结 类当中所拥有的一切,实例对象都能拥有
# 静态方法 在类中用@staticmethod来装饰的就是静态方法
# 静态方法和类无关系,不需要不需要指定任何参数,静态方法实例和对象都能使用
a.text2()
A.text2()

这节Python基础课程讲解了面向对象编程的重要概念,包括使用property装饰器、继承以避免代码冗余,方法的重写通过super()函数,以及多重继承的策略。还探讨了多态作为面向对象的三大特性之一,以及静态方法在属性和方法中的应用。
1120

被折叠的 条评论
为什么被折叠?



