模块

一个.py文件就称之为一个模块
使用模块 import sys
_name_特殊变量

面向对象编程

(Object Oriented Programming,OOP)
关于面向对象编程的一个有趣的解释:

上帝

class 类 (人)
instance 实例 (你,我,他)
你会有些属性(身高,年龄,体重)
你会有些技能(吃饭,泡妞)

init 方法的主要作用,就是初始化你的属性,这些属性,在上帝初始化你的时候就要赋予给你,比如zhangsan = Person(170,29,50)这时上帝就把你创造出来了,也就是实例化了你,然后,你到底有哪些技能呢,这就看有没有在类里面定义了,如果有定义泡妞的技能,那么你就可以调用泡妞的技能来泡妞,大致就是这样吧,看看下面的例子就更清楚了

class Person(object):
# 这里就是初始化你将要创建的实例的属性
    def __init__(self,hight,weight,age):
        self.hight = hight
        self.weight = weight
        self.age = age

# 定义你将要创建的实例所有用的技能
    def paoniu(self):
        print('你拥有泡妞的技能')

    def eat(self):
        print('you can eat')

# 开始创建实例
zhangsan=Person(170,50,29)
lisi = Person(175,100,30)

# 你的实例开始使用它的技能
zhangsan.paoniu()
lisi.eat()

定义类:class后是类名,类名通常是大写,紧接着是(object),表示类从那个类继承过来的,如果没有合适的继承类,就用object类。

class Building(object):
	def __init__(self,name,high,city)
			self.name=name
			self.high=high
			self.city=city
aa=Building('fishjump',1987,'shenzhen')
aa.name

由于类可以起到模板的作用,因此,可以在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去。通过定义一个特殊的__init__方法,在创建实例的时候,就把name,score等属性绑上去
注意到__init__方法的第一个参数永远是self,表示创建的实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。

数据封装

直接在类的内部定义访问数据的函数,这样数据就封装起来了。封装还可以给类增加新的方法

class Student(object):

    def __init__(self, name, score):
        self.name = name
        self.score = score

    def print_score(self):
        print('%s: %s' % (self.name, self.score))

访问限制

如果不想内部属性被外部访问,在属性前面加两个__,变成一个私有量,只有内部可以访问

class Student(object):

    def _ _init_ _(self, name, score):
        self._ _name = name
        self._ _score = score
     def print_score(self):
        print('%s: %s' % (self._ _name, self._ _score))
      bart=Student('xiaoming',98)
      bart.name   #不能调用

外部代码想要获取变量,给类增加方法

class Student(object):
    ...

    def get_name(self):
        return self.__name

    def get_score(self):
        return self.__score

外部代码修改变量

class Student(object):
    ...

    def set_score(self, score):
        if 0 <= score <= 100:
            self.__score = score
        else:
            raise ValueError('bad score')

继承和多态

子类获得父类的全部功能

class Animal(object):
    def run(self):
        print('Animal is running...')

class Dog(Animal):
    pass

class Cat(Animal):
    pass  
    
dog = Dog() #变量dog指向Dog的实例
dog.run()

cat = Cat()
cat.run()

当子类和父类存在相同的函数方法时(run()),子类的方法会覆盖父类的方法
多态,鸭子类型

获取对象信息

判断对象类型用type()函数
type(132)=int
判断class类型使用isinstance()函数,isinstance判断一个对象是否是该类型本身或者位于该类型的父继承链上。
a = Animal()
isinstance(a, Husky)
False
如果想获取对象的所有属性和方法,使用dir()函数,返回一个包含字符串的list

dir('ABC')
['__add__', '__class__',..., '__subclasshook__', 'capitalize', 'casefold',..., 'zfill']

__xxx__有特殊用途
操作对象状态用getattr(),setattr(),hasattr()

class MyObject(object):
   def __init__(self):
        self.x = 9
     def power(self):
       return self.x * self.x

 obj = MyObject()
 hasattr(obj,'x')   #有属性x吗?
 True
 setattr(obj,'y',19)   #设置一个属性y
 getattr(,obj,'y')    #获取属性y
 19
 getattr(obj,'z',404) #获取属性z,若不存在返回默认值404

实例属性和类属性

>>> class Student(object):
...     name = 'Student'      #定义类属性后所有的实例都可以访问
...
>>> s = Student() # 创建实例s
>>> print(s.name) # 打印name属性,因为实例并没有name属性,所以会继续查找class的name属性
Student
>>> print(Student.name) # 打印类的name属性
Student
>>> s.name = 'Michael' # 给实例绑定name属性
>>> print(s.name) # 由于实例属性优先级比类属性高,因此,它会屏蔽掉类的name属性
Michael
>>> print(Student.name) # 但是类属性并未消失,用Student.name仍然可以访问
Student
>>> del s.name # 如果删除实例的name属性
>>> print(s.name) # 再次调用s.name,由于实例的name属性没有找到,类的name属性就显示出来了
Student
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值