一.创建与调用
![17787668-382c109bb6e06f8d.png](https://i-blog.csdnimg.cn/blog_migrate/b9f49a1fc990e87f6cd423a46c0f58bd.png)
可以看到:实例方法的创建语句,和函数的定义语句很类似,唯一不同的是:实例方法中有个必须放在首位的参数self。
特殊参数self的作用:self会接收实例化过程中传入的数据,当实例对象创建后,实例便会代替 self,在代码中运行。换言之,self 是所有实例的替身
![17787668-f46264f7c380b7ff.png](https://i-blog.csdnimg.cn/blog_migrate/aa442f3099c9417748667ea47371bc62.png)
调用 :
![17787668-95715c409b3295b6.png](https://i-blog.csdnimg.cn/blog_migrate/1c9f93ccf9886883fd15be4b888ca2ce.png)
在类方法中调用类属性注意前面要加self :
class Chinese:
name = '吴枫' # 类属性name
def say(self):
print(self.name + '是中国人')
person = Chinese() # 创建Chinese的实例person
person.say() # 调用实例方法
同理,如果想在类的方法内部调用其他方法时,我们也需要用到self来代表实例。
第一点:只要在类中用def
创建方法时,就必须把第一个参数位置留给 self,并在调用方法时忽略它(不用给self传参)。
第二点:当在类的方法内部想调用类属性或其他方法时,就要采用self.属性名
或self.方法名
的格式。
初始化方法 :
定义初始化方法的格式是def __init__(self)
,是由init加左右两边的【双】下划线组成( initialize “初始化”的缩写)。
初始化方法的作用在于:当每个实例对象创建时,该方法内的代码无须调用就会自动运行。
class Chinese:
def __init__ (self):
self.mouth = 1 # self.不能丢
self.eye = 2
def body(self):
print('我有%s张嘴巴' % self.mouth)
print('我有%s只眼睛' % self.eye)
person = Chinese()
person.body()
使用初始化方法可以不定义类属性,self后面传参,赋值创建类属性 :
class Chinese:
# 初始化方法的创建,init两边双下划线。
def __init__(self, hometown):
self.hometown = hometown
print('你在哪里出生?')
def born(self):
print('我生在%s。' % self.hometown)
wufeng = Chinese('广东') # 传给参数hometown
wufeng.born()
面向对象和面向过程的区别:
![17787668-b9a79be352cff030.png](https://i-blog.csdnimg.cn/blog_migrate/a7962ad87cd48d35fcc5ffd4cd3baf10.png)
二.类继承
![17787668-46f702b2dc26224c.png](https://i-blog.csdnimg.cn/blog_migrate/7e58e0f25eb897e234190ad4ce7998fb.png)
很多类在创建时也不带括号,但实际上也是有父类的,
class Chinese:
在运行时相当于
class Chinese(object):
。而object,是所有类的父类,我们将其称为根类(可理解为类的始祖)。
判断某个实例是否属于某个类 : 函数isinstance()
# 阅读完代码再运行。
class Chinese:
pass
class Cantonese(Chinese):
pass
gonger = Chinese()
# 宫二,电影《一代宗师》女主,生于东北
yewen = Cantonese()
# 叶问,电影《一代宗师》男主,生于广东
print('\n验证1:子类创建的实例同时也属于父类')
print(isinstance(gonger,Chinese))
print(isinstance(yewen,Chinese))
print('\n验证2:父类创建的实例不属于子类。')
print(isinstance(gonger,Cantonese))
print('\n验证3:类创建的实例都属于根类。')
print(isinstance(gonger,object))
print(isinstance(yewen,object))
![17787668-e179d0532af53b12.png](https://i-blog.csdnimg.cn/blog_migrate/6f6865edb4ed79eb7078966b151841ff.png)
多层继承 : 子类创建的实例可调用所有层级父类的属性和方法。
class Earthman:
eye_number = 2
#中国人继承了地球人
class Chinese(Earthman):
eye_color = 'black'
#广东人继承了中国人,同时也继承了地球人。
class Cantonese(Chinese):
pass
yewen = Cantonese()
print(yewen.eye_number)
print(yewen.eye_color)
多重继承 : 和子类更相关的父类会放在更左侧。创建的实例在调用属性和方法时,会先在左侧的父类中找,找不到才会去右侧的父类找。(可理解为“就近原则”)
![17787668-eafae10051d15fc5.png](https://i-blog.csdnimg.cn/blog_migrate/8ea5a93def85a1c9f33c9fe45f3f3a09.png)
三.重写
class Chinese:
def land_area(self,area):
print('我们居住的地方,陆地面积是%d万平方公里左右。'% area)
class Cantonese(Chinese):
# 间接对方法进行重写
def land_area(self, area, rate = 0.0188):
Chinese.land_area(self, area * rate)
# 直接继承父类方法,再调整参数。
gonger = Chinese()
yewen = Cantonese()
gonger.land_area(960)
yewen.land_area(960)
子类继承父类方法的操作是在def语句后接父类.方法(参数),如上述代码的第八、九行。
重写示例 :
class Chinese:
def __init__(self, greeting = '你好', place = '中国'):
self.greeting = greeting
self.place = place
def greet(self):
print('%s!欢迎来到%s。' % (self.greeting, self.place))
class Cantonese(Chinese):
def __init__(self, greeting = '雷猴', place = '广东'):
Chinese.__init__(self, greeting, place)
yewen = Cantonese()
yewen.greet()