面向对象

 类:把一类事物的相同特征和动作整合到一起就是类,类是一个抽象的概念

对象:就是基于类出而创建的一个具体的事物或实例(具体存在),其特征和动作整合到一起

面向对象设计:将一类具体事物的数据和动作整合到一起,即面向对象设计

 

 

def dog(name,gender,type):


    def jiao():
        print('一条狗%s正在叫'%name)

    def chishi():
        print('%s正在吃fan'%name)

    def init(name,gender,type):
        doog={
            'name':name,
            'gender':gender,
            'type':type,
            'jiao':jiao,
            'chishi':chishi
        }
        return doog
    res=init(name,gender,type)
    return res


d1=dog('alex','','藏獒')
print(d1)
d1['jiao']()
d1['chishi']()

 

面向对象编程:用定义类+实例/对象的方式去实现面向对象的设计

使用class独特的语法完成面向对象设计,使用class后无需return   init函数的结果,本质上是初始化函数并返回init函数的值

class Dog:
    def __init__(self,name,gender,type):
        self.name=name
        self.gender=gender
        self.type=type
    def jiao(self):
        print('一条狗%s正在叫'%self.name)

    def chishi(self):
        print('%s正在吃fan'%self.name)


dog1=Dog('alex','female','京巴')
dog2=Dog('blex','male','藏獒')
dog3=Dog('clex','male','腊肠')

dog1.chishi()
dog2.jiao()
print(dog1.__dict__)

 

声明类:

class Chinese:
    '''
    这是中国人的类
    '''

    pass

print(Chinese)

#创建一个类
class Data:
    pass



#用类Data实例化出一个对象d1
d1=Data()


python2中class Chinese:为经典类,class Chinese(父类):为新式类

pyhton3中上述两类都是新式类

 

属性

 类是用来描述一类事物,类的对象指的是这一类事物中的一个个体

是事物就要有属性,属性分为

1.数据属性:就是变量

2.函数属性:就是函数,在面向对象里通常称为方法

注意:类和对象均用点来访问自己的属性

class Chinese(object):
    '''
    这是一个中国人的类
    '''
    party=''


print(Chinese.party)
class Chinese():
    '''
    这是一个中国人的类
    '''

    # def __init__(self, name):
    #     self.name=name
    party=''
    def love_nation(self):
        print('中国人都爱国')
    def warm_heart(self):
        print('中国人%s热心'%self)

print(Chinese.party)
print(dir(Chinese))
Chinese.love_nation(1)
Chinese.warm_heart('asfasf')
print(Chinese.__dict__)
Chinese.__dict__['love_nation'](1)
Chinese.__dict__['warm_heart']('asfasf')

Chinese.love_nation(1)本质上是调用Chinese.__dict__['love_nation'](1)

 

特殊的类属性:

__name__      类名

__doc__         类的文档字符串

__base__    类的第一个父类

__bases__ 类的所有父类构成的元组

__dict__  类的属性

__module__  类定义所在的模块

__class__  实例对应的类

 

类的属性

风湿理论:数据属性即变量,类的定义与函数极其类似,可以用函数的作用域来理解类的属性调用

 

对象相关知识

 

class Chinese():
    '''
    这是一个中国人的类
    '''

    def __init__(self, name,gender,age):
        print('我是初始化函数,我运行了')
        self.name=name
        self.gender=gender
        self.age=age
        print('我运行完了')
        #这个函数会自动返回一个None,不能返回其他值
    party=''
    def love_nation(self):
        print('中国人都爱国')
    def warm_heart(self):
        print('中国人%s很热心'%self.name)

p1=Chinese('Alex','male',18)#实例化,触发__init__函数的运行,会将p1传给self位置参数
print(p1.__dict__)
print(p1.gender)
p1.warm_heart()
print(p1.party)

实例属性字典中没有函数属性,实例调用方法时会根据风湿理论在上一层类中找方法,没有则报错,有则调用,可以把class当作最外层的函数,是一个作用域

若类中方法没有self参数,实例调用类中方法时会将自己作为参数传给方法,会报错

 self代表实例本身,python会自动将实例本身传给self参数

实例化的过程实际就是执行__init__的过程,这个函数内部只是为实例本身即self设定了一堆数据(变量),所以实例只用数据属性

 

 类属性

数据属性: 

查看类属性:Chinese.party

修改类属性:Chinese.party='我党'

 增加类属性:Chinese.city='北京'

删除类属性:del Chinese.party

 函数属性:

增加:

def play(self,ball):
    print('%s在玩%s'%(self.name,ball))

Chinese.play_ball=play
p1.play_ball('basketball') 

修改:

def test(self):
    print('test')
Chinese.play_ball=test
p1.play_ball()

 

作用域:

class Chinese:
    country='china'
    def __init__(self,name):
        self.name=name

p1=Chinese('alex')
p1.country='Deutsch'
print('类的>>>',Chinese.country)
print('实例的>>>',p1.country)


>>>类的>>> china
实例的>>> Deutsch


报错:

country='china'
class Chinese:

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

p1=Chinese('alex')


print(p1.country)

 

Country='china'
class Chinese:

    def __init__(self,name):
        self.name=name
        print(Country)

p1=Chinese('alex')

>>>china

 

变量与属性的区别:

 只又通过.找到的是属性,作用域在类里

Country='china'
class Chinese:

    def __init__(self,name):
        self.name=name
        print(Country)#这里的Country是变量,不是类的属性也不是实例的属性

p1=Chinese('alex')

>>>china

 

country='China'
class Chinese:
    country='Deutsch'
    def __init__(self,name):
        self.name=name
        print(country)

p1=Chinese('alex')
print('这是实例的----->',p1.country)


>>>China
这是实例的-----> Deutsch


=号相当于给实例添加一个属性值

class Chinese:
    country='China'
    l=['a','b']
    def __init__(self,name):
        self.name=name


p1=Chinese('alex')
p1.country='Deutsch'
print(p1.country)
print(Chinese.country)
p1.l=[1,2,3]
print(Chinese.l)


>>>Deutsch
China
['a', 'b']


append本质上调用的是类的属性,而不是给实例赋一个新的值

class Chinese:
    country='China'
    l=['a','b']
    def __init__(self,name):
        self.name=name


p1=Chinese('alex')


p1.l.append('c')
print(p1.__dict__)
print(Chinese.l)


>>>{'name': 'alex'}
['a', 'b', 'c']

 

 __call__()的作用是使实例能够像函数一样被调用,同时不影响实例本身的生命周期(__call__()不影响一个实例的构造和析构)。但是__call__()可以用来改变实例的内部成员的值

 __call__()函数解释:https://blog.csdn.net/qq_18649781/article/details/89705611

 

 

 1

posted on 2019-04-18 15:53  Manuel  阅读(451)  评论(0编辑  收藏  举报