我々は(:オブジェクト指向プログラミングOOP)は、オブジェクト指向プログラミングを理解しました
オブジェクト指向およびプロセス指向
プロセス指向プログラミングとは何ですか?
答えは:最初に行う、その後、何によると、最後の思考は何ですか。物事を自分、ライン、プログラマーある賃金労働者の視点
長所:複雑な問題の簡素化、合理化
短所:貧しいスケーラビリティ
オブジェクト指向プログラミングとは何ですか?
:オブジェクト指向プログラミングでは、プログラマは、問題を自分で解決するために、この世界では、プログラマはターゲットを作成した、世界を作るようなものです。物事は、上司のプログラマの視点に乾燥することがあります。
利点:スケーラビリティ
短所:ややプロセス指向の複雑さのために
オブジェクトとクラスの概念
オブジェクト:
- 前記(変数)とスキル(機能)の組み合わせ。
- オブジェクトは、物事の特定の存在であります
カテゴリー:
- オブジェクトとスキルの同じ特性(可変の)数(関数)の組み合わせ
- クラスは抽象的な概念であります
現実の世界では:それは、特定のオブジェクトであり、その後、これらのオブジェクトは、クラスに起因する同じ特性やスキルを持っています。例えば:一部の人々はこれが第一の目的で、その後、誰もが人類のこの抽象的な概念に降りてきます。
プログラム中:最初のクラスの定義であり、そのクラスは、オブジェクトとしてインスタンス。
カテゴリ
一つのクラスでは、変数や関数の最も一般的な定義。フォーカス:ボディクラスコードが定義フェーズで実行し、クラスの名前空間に投入されたクラスの名前空間、生成されるコードのクラス本体の名前を、生成されます。
クラスの実行前に呼び出さコードのみの体内機能、**しかしが、__init__関数内のように定義の時点で実行されます。**
#查看类名称空间里面的名称:__dict__
class Student:
school = '社会大学'
def __init__(self, name):
self.name = name
def study(self):
print('我是学生,我会学习')
print(Student.__dict__)
'''
结果:{'__module__': '__main__', 'school': '中北大学', '__init__': <function Student.__init__ at 0x108e685f0>, 'study': <function Student.study at 0x108e684d0>, '__dict__': <attribute '__dict__' of 'Student' objects>, '__weakref__': <attribute '__weakref__' of 'Student' objects>, '__doc__': None}
school、study、__init__: 类定义时产生的名称
__module__:当前文件的模块,因为是执行文件,所以是__main__
__doc__:类的文档注释
'''
print(Student.school) #结果:社会大学 #相当于:print(Student.__dict__['school'])
print(Student.study)
#结果: <function Student.study at 0x1013244d0> #相当于:print(Student.__dict__['study'])
Student.school = '北京大学' # 相当于Student.__dict__['school'] = '北京大学'
(****)のクラスは、本質的に変数と関数の名前を保持名前空間であり、変数と関数の貯蔵容器であります
クラスのいずれかを使用します。名前空間から名前を見つけます
二つのカテゴリーの使用:緑のオブジェクト
クラスは、すべてのオブジェクトを変数を変更した場合。この変数は変更される場合には、クラスで定義された変数は、すべてのオブジェクトによって共有されています。オブジェクトは、オブジェクトの変数の型を変更することはできません。クラス変数を、本質的には、この変数のクラスを変更していない、自分のオブジェクトに名前空間属性を追加することです。
class Student:
age = 18
def __init__(self):
pass
stu1 = Student()
stu2 = Student()
print(stu1.age) # 18
print(stu2.age) # 18
Student.age = 10
print(stu1.age) # 10
print(stu2.age) # 10
stu1.age = 20
print(stu1.age) # 20
print(stu2.age) # 10
print(stu1.__dict__) # {'age': 20}
オブジェクト
オブジェクトを生成することができますクラスを呼び出します。
呼び出し後の戻り値は、オブジェクトのクラス/インスタンスと呼ばれています。
手順は、クラスは、クラスをインスタンス化と呼ばれる呼び出します。
オブジェクトの性質も名前空間を形成します。クラスは何のinitパラメータがない場合は、名前空間のオブジェクトは空です。
例1:
class Student:
def __init__(self):
print(1)
stu = Student()
print(stu.__dict__) #结果:{}
例2:
class Student:
def __init__(self, name):
self.name = name
stu = Student('你爹')
print(stu.__dict__) #结果:{'name':'你爹'}
フォーカス:クラスを呼び出すために何が起こりましたか?
図1に示すように、空のオブジェクトリターンを生成します
図2に示すように、関数のクラスINITトリガの実行と、initに渡される最初のパラメータのこの空のオブジェクト。最初のパスパラメータ初期化パラメータの後に再び括弧内のクラスのパラメータを呼び出します。
INIT補足:クラスが実行される際に1は、初期化関数が呼び出されます。2、init関数は値を返しません。
物件検索順序
バックと呼ばれるオブジェクト。属性。属性
オブジェクトは。場合は財産、今はそのようなプロパティが存在しない見つけるために、そうでない場合は、内部クラスから名前空間属性を見つけるために、内部空間オブジェクトの名前。
class Student:
school = '中北大学'
age = 18
def __init__(self, name):
self.name = name
def study(self):
print(1)
stu = Student('你爹')
print(stu.name)
print(stu.age)
'''
说明:stu的命名空间只有name, stu.__dict__ = {'name':'你爹'}, 没有age,这时候就在类的名称空间中找。
类名称空间在类定义的时候有:school, age, __init__, study等,有age,则返回18
'''
バインディングのアプローチ
図1に示すように、クラス変数はクラスで定義されてもよい、オブジェクトを使用することもできます。呼び出したどんなに、同じアドレスへのすべてのポイント。クラス変数の値を変更すると、すべてのオブジェクトの呼び出しと一緒に両方の変更。
class Student:
age = 18
def __init__(self):
pass
stu = Student()
print(id(stu.age)) # 4362244432
print(id(Student.age)) # 4362244432
Student.age = 20
stu1 = Student()
print(stu.age) # 20
print(stu1.age) # 20
関数のクラスで定義された2は、クラスは、クラスを呼び出すとき、この関数は通常の関数であり、使用することができます。クラスで定義された関数は、オブジェクトのために使用されています。そして、オブジェクトにバインドするために使用されます。
何が標的に結合されましたか?
class Student:
school = 'oldboy'
def __init__(self, name, age, sex):
self.name = name #stu1.name='小白'
self.age = age #stu1.age=18
self.sex = sex #stu1.sex='male'
def choose_course(self,x): #self=stu1
print('%s choosing course' %self.name)
stu1=Student('小白',18,'male') # 小白 choosing course
stu2=Student('小花',38,'female') # 小花 choosing course
stu3=Student('小黑',28,'male') # 小黑 choosing course
'''
如上,用类实例化了三个对象,三个对象分别调用类里面的函数。调用时,会自动把对象传给类函数的第一个参数。
也就是说,类方法分别绑定给了不同的对象,哪个对象调用,用到的就是哪个对象的名称空间。不同对象互不干扰。
'''