欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python面向对象--高级(二)

程序员文章站 2022-03-07 17:20:18
Python使用__slots__限制实例属性,多重继承,类的组合使用 ......

## 使用__slots__限制类的属性
  - 之前说到,可以通过在类外部实例或者类名任意定义实例属性或者类属性或者方法

 1 class Person(object):
 2     pass
 3 
 4 
 5 Person.name = "Stanley"         # 在外部添加类属性
 6 print(Person.name)              # 输出:Stanley
 7 
 8 per1 = Person()
 9 per1.age = 22                   # 在外部添加实例属性
10 print(per1.age)                 # 输出:22
11 
12 per2 = Person()
13 # print(per2.age)               # 实例属性只由定义该属性的实例所有,其他的实例无法访问
14 
15 
16 def outer_init(self, name):
17     self.name = name
18 
19 
20 Person.__init__ = outer_init    # 在外部修改类方法
21 per3 = Person("Lily")
22 print(per3.name)                # 输出:Lily, 说明类方法修改成功

 

  - 若想要限制实例的属性,可以使用__slots__

 1 class Person(object):
 2     __slots__ = ("name", "age")     # 限制实例属性
 3     count = 1
 4 
 5 
 6 Person.nationality = "China"        # 仍然可以定义类属性
 7 print(Person.nationality)           # 输出:China
 8 
 9 
10 per1 = Person()
11 per1.name = "Lily"
12 per1.age = 17
13 
14 per1.nationality = "China"
15 # 类属性为只读属性,无法通过实例修改,只能通过类名修改
16 # AttributeError: 'Person' object attribute 'nationality' is read-only
17 
18 per1.gender = "female"
19 # 无法通过实例定义新实例属性
20 # AttributeError: 'Person' object has no attribute 'gender'
21 
22 
23 per1.count = 100
24 # AttributeError: 'Person' object attribute 'count' is read-only

 

## 多重继承
  - Python是允许多重继承的,多重继承时代子类拥有多重特征

 1 class Person(object):
 2     @staticmethod
 3     def pursuit_happiness():
 4         print("幸福是奋斗出来的!")
 5 
 6 
 7 class Father(Person):
 8     character = "温和,坚韧"
 9 
10 
11 class Mather(Person):
12     interest = "阅读,文艺竞技"
13 
14 
15 class Student(Person):
16     @staticmethod
17     def do_homework():
18         print("是学生就要做作业!")
19 
20 
21 class Son(Father, Mather, Student):     # 多重继承
22     pass
23 
24 
25 s = Son()
26 # Son类实例具有了Father类的属性
27 print(s.character)              # 输出:温和,坚韧
28 # Son类实例具有了Mather类的属性
29 print(s.interest)               # 输出:阅读,文艺竞技
30 # Son类实例具有了Student类的方法
31 s.do_homework()                 # 输出:是学生就要做作业!
32 # 由于Father类,Mather类,Student类都各自继承了Person类,所以Son类也有Person类的方法
33 s.pursuit_happiness()           # 输出:幸福是奋斗出来的!

 

  - 类的组合使用

 1 class Car(object):
 2     def __init__(self, color, owner):
 3         self.color = color
 4         self.owner = owner
 5 
 6 
 7 class House(object):
 8     def __init__(self, location, owner):
 9         self.location = location
10         self.owner = owner
11 
12 
13 class Person(object):
14     def __init__(self, name, car=None, house=None):
15         self.name = name
16         self.car = car
17         self.house = house
18 
19 
20 per1 = Person("Stanley")        # 实例化Person
21 c = Car("Black", per1)          # 实例化Car
22 h = House("China", per1)        # 实例化House
23 per1.car = c                    # 把实例化的car给per1
24 per1.house = h                  # 把实例化的house给per1
25 
26 # 通过person访问car的属性
27 print(per1.car.color)           # 输出:Black
28 # 通过person访问house的属性
29 print(per1.house.location)      # 输出:China
30 # 通过house和car访问person的属性
31 print(h.owner.name)             # 输出:Stanley
32 print(c.owner.name)             # 输出:Stanley

 

本文参考:

  [美]Bill Lubanovic 《Python语言及其应用》
  https://www.liaoxuefeng.com 廖雪峰的官方网站