2017-10-29-08类概念,定义,属性,继承笔记

类的慨念、定义、属性、继承

#类   类是对现实生活中,具有共同特征的事物的抽象。

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'>)

猜你喜欢

转载自blog.csdn.net/github_38970218/article/details/88543666