类的慨念、定义、属性、继承
#类 类是对现实生活中,具有共同特征的事物的抽象。
class Animal(object):
pass
#object, 基类。 任何类都需要继承object
#类 (模子)
class Animal: #python3 继承object,可写可不写
pass
>>> dir(Animal)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
>>> dog=Animal()
>>> dog
<__main__.Animal object at 0x0000000002B04E10>
>>> type(dog)
<class '__main__.Animal'>
>>> dir(dog)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
>>>
#构造方法_ _ init_ _( ) , self 参数
# 构造方法,实例化对时,必须掉调用init
class Animal:
def __init__(self):
print('正在实例化一个类')
# 构造方法,实例化对时,必须掉调用__init__
def test(self):
print('aaa')
>>> class Animal:
def __init__(self):
print('正在实例化一个类')
>>> dog=Animal()
正在实例化一个类
>>>
#当我们没有写init() ,默认调用我们父类_ _init _ _
class Animal:
def test(self):
print('aaa')
'''
self, 实例化对象(本身)
self 可以替换成别的参数名。但是最好别改
类: TestSelf #方法 :testSelf 命名(类首字母大写,方法首字母小写)
'''
#构造方法__init__不写self会报错
>>> class TestSelf:
def __init__():
print('正在实例化')
>>> test=TestSelf()
Traceback (most recent call last):
File "<pyshell#24>", line 1, in <module>
test=TestSelf()
TypeError: __init__() takes 0 positional arguments but 1 was given
>>>
#类的方法不写self也会报错
>>> class TestSelf:
def __init__(self):
print('正在实例化')
def test():
#如果括号里没有self,那么它默认的self就是TestSelf
print('aaa')
def test1(self):
print('bbb')
>>> t=TestSelf()
正在实例化
>>> t.test1()
bbb
>>> t.test()
Traceback (most recent call last):
File "<pyshell#48>", line 1, in <module>
t.test()
TypeError: test() takes 0 positional arguments but 1 was given
#只能这么调用test()方法不报错
>>> TestSelf.test()
aaa
'''
属性, 属性本质上就一个变量
1.实例化属性
2.类属性 (共有属性)
1.实例化属性 , self.name
'''
class Animal:
def __init__(self,name,food):
print('正在实例化')
self.name = name
self.food = food
def get_name(self):
print(self.name)
#2.类属性 (共有属性)
class Animal:
eye = 2
leg = 4 #共有的
def __init__(self,name,food):
print('正在实例化')
self.name = name
self.food = food
def get_name(self):
print(self.name)
#私有化
'''
在Python中,通过单下划线”_”来实现模块级别的私有化,
一般约定以单下划线”_”开头的变量、函数为模块私有的,
也就是说”from moduleName import *”
将不会引入以单下划线”_”开头的变量、函数
import random #全部会导入
from random import* #_Set 不会导入
'''
class Animal:
_eye = 2
__leg = 4 #共有的
def __init__(self,name,food):
print('正在实例化')
self.name = name
self.food = food
def get_name(self):
print(self.name)
'''
_”和” __”的使用 更多的是一种规范/约定,并没有真正达到限制的目的:
'dog._Animal_ _leg' ## _ _默认加一个类名,用来警告
“ _ _foo_ _ ”:以双下划线开头和结尾的(_ _foo_ _)
代表python里特殊方法专用的标识,如 _ _init_ _()
'''
#面向对象 三个特征: 封装 ,继承 多态
#封装:例如
class Animal:
eye = 2
leg = 4 #共有的
def __init__(self,name,food):
print('正在实例化')
self.name = name
self.food = food
def get_name(self):
print(self.name)
def get_food(self):
print(self.food)
#继承
#面向对象的编程带来的主要好处之一是代码的重用
class People(Animal):
leg = 2
def __init__(self,name,food,sex):
self.name = name
self.food = food
self.sex = sex
def get_sex(self):
print(self.sex)
def speak(self):
print('asdsdgfsagg')
def eat(self):
print('果子')
#多态, (子类重写父类方法) ,继承。 (同一个方法,有不同表形式)
class Chinse(People):
def speak(self):
print('你好')
def eat(self):
print('米饭')
class America(People):
def speak(self):
print('hello')
def eat(self):
print('面包')
class Thai(People):
def speak(self):
print('萨瓦迪卡')
def eat(self):
print('香蕉')
#shell环境下运行
>>> xm=Chinese('小明','米饭','男')
>>> jk=America('jeck','面包','男')
>>> ll=Thai('lala','香蕉','未知')
>>> xm.speak()
你好
>>> jk.speak()
hello
>>> ll.speak()
萨瓦迪卡
####查看类的mro模型和父类
>>> class A(object):
pass
>>> class B(A):
pass
>>> class C(B):
pass
>>> class D(B):
pass
>>> class E(B,A):
pass
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>> A.__class__
<class 'type'>
>>> B.__class__
<class 'type'>
>>> B.__mro__
(<class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
>>> C.__mro__
(<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
>>> D.__mro__
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
>>> E.__mro__
(<class '__main__.E'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
>>> A.__bases__
(<class 'object'>,)
>>> B.__bases__
(<class '__main__.A'>,)
>>> C.__bases__
(<class '__main__.B'>,)
>>> D.__bases__
(<class '__main__.B'>,)
>>> E.__bases__
(<class '__main__.B'>, <class '__main__.A'>)