Python学习 4day__基础知识


类和对象的成员分析

  类和对象都可以储存成员, 成员可以归类所有,也可以归对象所有
  类存储成员时使用的是与类关联的一个对象
  独享存储成员是存储在当前的对象中
class A():
    name = "xiaowang"
    age = 16

    def say(self):
        self.name = "shaiz"
         self.age = 18

print(A.name)
print(A.age)
print(id(A.name))
print(id(A.age))
a = A()
print(a.name)print(a.age)
print(id(a.name))  #  对比id
print(id(a.age))
a.name = "xiaoshabi"
a.age = 19
print(a.name)
print(a.age)
print(id(a.name))  #  对比id
print(id(a.age))  

 

 


self

  self在对象的方法中表示当前对象本身,如果通过对象调用一个方法,那么该对象会自动传入到当前
  self不是关键字,理论上可以用任何一个普通变量

class A():
    name = "xiaowang"
    age = 16

    def say(self):
       self.name = "小哥哥"
        self.age = 18
        print("My name is {0}".format(self.name))
        print("My age is {0}".format(self.age))
    def ask():                           # 没有self
        print("Tell me why ")

a = A()
a.say()
A.ask()                                  # 要用绑定类名    

封装

  封装就是对对象进行访问权限限制
  三个级别:
   公开:public
   受保护的:protected
  私有的:private

  私有

    私有是最高级别的封装,只能在当前类或者对象中访问
    封装方法:在成员前面添加两个下划线,表示成员私有
    Python中的私有,并不是真正意义上的私有,只是自动把变量名改了,可以通过__dict__来查看
1 class Person():
2     name = "小哥哥"             # 公有
3     __age = 20                  # 私有
4 
5 p = Person()
6 print(p.name)  # 访问公有
7 # print(p.age)   # 访问私有///报错
8 print(Person.__dict__)        # 查看

 

  受保护的封装

    将对象成员就像一定级别的封装,然后,在类中或者子类中都可以进行访问,但是在外部不可以
    封装方法:在成员前面加一个下划线

  公有

    对成员不进行任何操作即可,任何地方都可以访问

继承

  继承就是一个类可以获得另外一个类中的成员属性和成员方法
  用来减少代码,增加代码的复用
  所有的类都继承object类,因此所有类都是object类的子类
 1 class Person(object):                # 继承objetc类
 2     name = "laoshi"
 3     age = 16
 4     def sleep(self):
 5         print("我睡了。。。。。")
 6 
 7 class Teacher(Person):                # 继承Person
 8     def make_test(self):
 9         print("考试考试考试")
10     a = Teacher()
11     print(a.name)               # Teacherl类继承了person类
12     print(Teacher.name)         # Teacherl类继承了person类       


子类和父类定义同一个变量名称,则优先使用子类本身

1 class person(object):
2     name = "我是Person"
3 class Teacher(Person):
4     name = "我是teacher"
5 
6 t = Teacher()
7 print(t.name)


子类如果想扩充父类的方法,可以在定义新方法的同事访问父类成员进行代码重用
 1 class Person(object):
 2     name = "我是Person"
 3     age = 19
 4     def work(self):
 5         print("make some money")
 6 class Teache(Person):
 7     name = "我是teacher"
 8     def make_tset(self):
 9         print("attention")
10     def work(self):
11         Person.work(self)          # 扩充父类功能只需要调用父类相应的函数
12         #super().work()             # 扩充的第二种方法
13        self.make_tset()
14 
15 x = Teache()
16 x.work()

 


  继承变量函数的查找顺序

    优先查找自己的变量,没有则查找父类
    构造函数如果本类中没有定义,则自动查找调用父类构造函数
    如果有,则不继续向上查找

  构造函数

    是一类特殊的函数
    __init__()函数,每次实例化的时候第一个被自动调用
    主要工作是进行初始化

1 class sport():
2     def __init__(self):   # __这就是构造函数
3         print("一起做运动!")
4 # 实例化,自动调用__init__
5 me = sport()    

 



  super

    首先super不是关键字,它是一个类
    作用是获取MRO列表中的第一个父类
    super与父类没有任何实质性的关系,但super可以调用到父类
  
单继承和多继承

  单继承:每个类只能继承一个类
  优点:
  继承有序,逻辑清晰,语法简单
  缺点:
   功能不能无限拓展,只能在唯一的一条继承链中拓展
  多继承:每个类允许继承多个类
  优点:
   类的功能拓展方便
  缺点:
  继承关系混乱,隐患多,产生菱形问题


 1 class Fish(object):
 2     def __init__(self, name):
 3         self.name = name
 4 
 5     def swim(self):
 6         print("swiming.......")
 7 
 8 
 9 class Bird(object):
10     def __init__(self, name):
11         self.name = name
12 
13     def fly(self):
14         print("flying.......")
15 
16 
17 class Person(object):
18     def __init__(self, name):
19         self.name = name
20 
21     def work(self):
22         print("working.......")
23 
24 
25 class Student(Person):                   # 单继承
26     def __init__(self, name):
27         self.name = name
28 stu = Student("Bud")
29 stu.work()
30 
31 class SuperMan(Person, Bird, Fish):       # 多继承
32     pass
33 s = SuperMan("Burtit")
34 s.fly()
35 s.swim()

 


多态

  多态就是同一个对象在不同情况下有不同的状态出现
  多态不是语法,是一种思想
  多态性:一种调用方式,不同的执行效果
  多态:同一种事物的多种形态,如动物分为人类,鸡类,毛类

类相关函数

  issubclass(): 检测一个类是不是另一个类的子类
  isinstance(): 检测一个对象是否是一个类的实例
  hasatter: 检测一个对象是否有某个成员
  getattr: 获取属性值,必须存在
  setattr:设置属性值,属性必须存在
  delattr:删除属性
  dir(): 获取对象的成员列表
  and so on...


 1 class A():
 2     age = 16
 3 class B(A):
 4     pass
 5 class C():
 6     pass
 7 
 8 print(issubclass(B, A))          # 检测B是否是A的子类
 9 a = A()
10 print(isinstance(a, A))          # 检测a是否为A的实例
11 print(getattr(a,"age"))          # 查看a中的age的值
12 
13 print(setattr(a, 'age', 199))    # 将a中的age值改为199
14 print(a.age)
15 print(delattr(A, 'age'))         # 删除A中age的值
16 print(A.__dict__)                # 查看发现无age了
17 print(hasattr(a,'age'))          # 检测a中是否有成员age

 




dir(A) # 获取a的成员列表
posted @ 2018-07-16 20:42  Burtit  阅读(213)  评论(0编辑  收藏  举报