객체 지향
PS : 상관없이 어떤 언어, 객체 지향 세 가지 요소가 없습니다 : (클래스 변수와 함수를 캡슐화) 패키지, 상속, 다형성
객체 지향 (OO, 객체 지향은) 코드를 작성하는 생각의 방법입니다 : 프로그램이 구성하는 것입니다. 객체 지향 프로그래밍 : OOP (객체 지향 프로그래밍)
클래스는, 사실, 추상화입니다. 은 동일한 특성을 분류하여 그는 일, 추상적 인 소위. 예를 들어, 사용자 클래스, 추상 사용자 정보를 함께
속성 및 클래스의 방법.
등록 정보 :이 클래스의 특성을 보여줍니다
방법 (동작) 기능 클래스를 지정합니다
추신 : 혹 구조와 규칙, 클래스, 대문자 첫 글자
프로그램 (클래스) 데이터 구조 (특성) + 알고리즘 (방법, 작용) =
객체 지향 프로세스 절차의 세계에 현실 세계를지도하는 것입니다
특정 클래스 : 예
자기 : 현재의 오브젝트 (메소드의 호출)
CLS : 오브젝트의 클래스
참고 : 자기 또는 CLS 중 하나, 다만 변수 이름 만이 두 이름의 사용에 익숙한, 당신은 또한 다른 이름을 사용할 수 있습니다 (현재되지 않은 학습 공식 설명, 개인의 이해 : 첫 번째 매개 변수의 인스턴스 방법은 개체 자체의 인스턴스를 나타낸다는 첫 번째 매개 변수) 자체 클래스 클래스 메서드를 나타내는
기본 생성자의 매개 변수가 파이썬은 할 수 없습니다
클래스 기능 호출 항에있어서 어느
class Cat:
#__new__方法分配内存,单例模式时会用到此方法
def __new__(cls, *args, **kwargs): #new方法为什么需要这些参数?此处这样写只是为了可以接受任何形式与数目的参数,在new里面一般并用不到,但是执行了new之后会自动调用init方法,那时会用到这些参数。亦即:*args与**kwargs并不是必要的格式。比如,在init方法中,如果需要的是除了self之外的一个参数(如name),那么此处也可以只声明一个变量接受该参数即可
print("__new__")
return super().__new__(cls) #也可以:return = object.__new__(cls) 另,此处以本人目前的知识猜测,在object类中应是用了@property修饰了__new__()方法的,所以此处如果用object可以不加括号。加了括号也是一样的
#注意:__new__方法必须要有返回值,返回实例化出来的实例,可以返回父类__new__返回代实例(此处采用的方法),也可以直接将object的__new__出来的实例返回
#构造方法,该方法会创建对象(实例),自动调用
def __init__(self, color, name):
#前后有双下划线的方法由程序自动调用
self.color = color
self.name = name
def catch_mouse(self):
print(self.name + " 正在抓老鼠")
def __del__(self):
print("对象空间已经被释放") #当对象的空间被释放的时候(引用对象的个数为0的时候)会自动调用此方法
#ps:对象的引用个数可以用`import sys \n sys.getrefcount(Object)`来获取,比实际的对象多1,如果该对象空间已经被释放,则会报错
#创建实例
tom = Cat("Blue","Tom")
print(tom.name)
프로세스 개체의 예 :
- (__new __ ())는,이 방법이 때 하나의 디자인 패턴을 사용하는 메모리를 할당한다. 공간의 새로운 블록이 후 자동으로 init 메소드를 호출하면,이 때 새로운 방법은 자동으로 수신 된 매개 변수 init 메소드에 전달됩니다. 새로운 공간은 자기 참조의 init 메소드에 전달
- 초기화 값 (의 __init __ ())
__new__()方法的注意事项:__new__方法必须要有返回值,返回实例化出来的实例,可以返回父类__new__返回代实例(此处采用的方法),也可以直接将object的__new__出来的实例返回
등록 민영화 :
3. XX : 밑줄 민영화 속성 또는 메서드 전에 단일 세트가 개체에 액세스 할 수있는 모듈에 직접 사용하지만, somemodule 수입 * 수입, 클래스와 서브 클래스 금지 할 수 있습니다
4. 때 명명 된 속성 앞에 플러스 "__", 즉 문법 규칙입니다, 두 개의 밑줄입니다.
S : XX는 , 파이썬 키워드와 충돌을 피하기 위해, 하나의 게시물을 밑줄
도 클래스에 사용되는 개인 재산 또는 개인 방법, 추가해야합니다 __
, 즉, 이중 밑줄을
왜 밑줄 민영화 (숨겨진 변수) 두배로 할 수
__dict__을 : 모든 개체는 인스턴스의 모든 속성으로 가득이 속성이 있습니다. 이중 밑줄 속성을 시작으로, 이름이 변환됩니다 : _ __ + 클래스 이름 속성 명,이 시간에 의해 对象名._类名__属性名
접근
전용 속성에 액세스하는 방법 : 방법으로
class Student:
"""
学生类
"""
def __init__(self, name, age):
self.__name = name
self.__age = age
def set_name(self, name):
if not len(name) < 3:
self.__name = name
def get_name(self):
return self.__name
#标注,默认是get的。@就是一个标记,比如下面的@age.setter,当用“=”时,就调用该函数。如果是用的".",就调用此方法
@property #@语法糖,前面加这个的可以像使用属性一样使用方法,即不用加括号
def age(self):
return self.__age
#使用了@后方法名必须与属性名一致
@age.setter #让方法可以像属性一样使用
def age(self,age):
self.__age = age
tom = Student("tom", 23)
print(tom.get_name())
tom.set_name("jack")
print(tom.get_name())
tom.hight = 23 #为tom额外添加hiht属性。
print(tom.age) #可直接获得年龄,其实tom.age是在调用方法
tom.age = 18 #使用语法糖的方式更改属性值
print(tom.age) #这里也使用了语法糖,实际上是调用的age方法
#输出:
tom
jack
23
18
재산의 사용에 대한 두 번째 방법
class A(object):
def __init__(self):
self.__num = 10
def set_num(self,num):
self.__num = num
def get_num(self):
return self.__num
num = property(get_num,set_num) #这里的方法名可以任意取,则当使用=进行赋值操作时,相当调用第二个方法(设置值的方法),当仅仅是取值的时候,则调用第一个方法(取值的方法),等号前面的变量名必须与属性的变量名一致,但是不用加双下划线
obj = A()
print(obj.num)
obj.num = 15
print(obj.num)
Object 클래스 자체는
일반적으로 : 클래스 속성, 클래스 메소드를 조작하려면, 객체가 작동 예를 들어, 방법의 예를 들면
자기 속성 이름 : 인스턴스 속성.
class User:
# 在类里面定义的属性称为类属性,由所有实例共享。一般不在这里面写东西。
num = 0
def __init__(self, name):
self.__name = name
User.num += 1
def print_name(self):
print(self.__name)
print(User.num)
@property
def name(self):
return self.__name
@classmethod # 标注,表明这是类方法。即可以通过类名调用,必须用一个cls参数,cls就是类本身,与对象的self相当。
def creat_user(cls, name, age): # cls其实就是类本身
user = cls(name)
user.age = age
return user
@staticmethod # 静态方法,可以直接通过类名调用。当一个方法即和类没有关系又和对象没有关系时,就用静态方法,就不用cls和self参数
def sum(a, b):
return a + b
def __str__(self): #当print对象的时候会调用这个方法。这个方法必须返回一个字符串
_str = ""
for k,v in self.__dict__.items():
_str += str(k)
_str += ":"
_str += str(v)+" "
return _str
u = User("zhangsan")
u1 = User("lisi")
u.print_name()
u1.print_name()
User.num += 1
print(User.num)
u2 = User.creat_user("wangwu", 20)
# @classmethod修饰的方法是类方法,类方法可以通过类名调用。类方法必须有一个参数,cls,即类本身
print(u2.name)
print(User.sum(1, 3)) #通过类名调用静态方法
print(u.sum(2,4)) #通过实例对象调用静态方法
print(u1.sum(1,3))
u3 = u1.creat_user("laoli",50)
print(u3.name)
print(u1)
상속
파이썬 지원하는 다중 상속 및 상속 연속 순서 관련 콘텐츠 (제 클래스에서 상속되는 속성)
상위 클래스의 직접적인 방법을 호출 할 수있는 서브 클래스 객체는 또한 상위 클래스의 속성이 있습니다
모든 클래스는 기본 객체 클래스를 상속합니다
주 : 사유 재산과 부모 클래스의 private 메소드는 (__의로 시작하는) 상속되지 않습니다 만, 사유 재산이 상속되는 경우 방법 (재 작성하지 않음) 개인 속성 또는 부모 클래스의 방법, 부모 클래스를 방문하거나 개인 방법이나하자이 방법을 사용
class A:
def __init__(self):
self.name = "A"
def print_test(self):
print("A"*10)
class B(object): #ps:如果一个类没有继承任何类,建议写上object类,object类是所有类最终的父类,即:所有类都继承自object类
def __init__(self):
self.name = "B"
def print_test(self):
print("B"*10)
class C(A): #A是C的父类,又称基类。C是A的子类,派生类。C继承自A
def __init__(self):
super().__init__() #调用父类的初始化方法
self.age = 20
class D(A,B): #多继承,是按照顺序,比如此处有两个name,那么D就继承到了A的。
def print_test(self):
super().print_test()
self.print_test()
c = C()
print(c.name)
print(c.age)
d = D()
print(d.name)
print(C.__mro__) #mro中的顺序是由C3算法决定的
#上面这句会输出:(<class '__main__.C'>, <class '__main__.A'>, <class 'object'>),表明调用C类的对象的方法时,搜索的顺序,如果C没有该方法,就用A的,如果A还没有,就调用object类的(caution,object类是所有类的父类,因为这里A没有继承除了object类之外的类,所以是A中找不到就到object中去找,如果A继承了其他类,比如D类,则A中找不到就会到D中去查找。即查找顺序为:本类>父类(按继承的先后顺序,先继承的先用)>父类的父类
print(isinstance(d,A)) #判断一个对象是否是一个类的实例。输出True,子类的对象也是父类的实例
print(issubclass(D,A)) #判断一个类是否是另一个类的子类
#以上的顺序表明了查找属性的顺序(多继承的访问顺序),如果C本身有,就用C本身的,如果C本身没有,而A有,则用A的,再否则用B的
오리 형
불과 몇 클래스는 같은 부모로부터 상속하지 않습니다, 같은 클래스에 속하는 것으로 간주 할 수있다하더라도, 유사한 기능이나 특성을가집니다. 예를 들어, 다음과 같은 프로그래머와 관리자의 경우, 비록 같은 부모로부터 상속하지,하지만 직원이,이 메서드 나 속성에 의도적으로 유사한 정의 가능한 것이 분명하다
class Programer:
def dowork(self):
print("编程")
class Manager:
def dowork(self):
print("管理")
p = Programer()
m = Manager()
p.dowork()
m.dowork()
#判断某一对象是否是一个类的实例
print(isinstance(p,Programer))
고쳐 쓰기
이것은 부모 클래스와 서브 클래스 방법에서 같은 이름의 정의를 다시 작성하는 방법이다, 메소드 호출을 호출 한 후 오히려 부모 클래스의 방법보다, 자신의 것입니다.
class Animal:
name = "狗"
def eat(self):
print("-----吃-----")
def run(self):
print("-----跑-----")
class Dog(Animal):
def bark(self):
print("-----汪汪叫-----")
class XiaoTian(Dog):
def fly(self):
print("-----fly-----")
def bark(self):
print("-----狂叫-----“)
#Dog.bark(self) #通过父类的类名,并以self为参数,可以调用父类中被重写了的方法
super().bark() #通过super().方法名(),可以也可以调用父类被重写的方法,此种方法不需要self参数
xt = XiaoTian()
xt.run()
xt.bark()
xt.eat()
print(xt.name)
다형성
정의 : 유형 정의 및 런타임의 동일한 유형이 아닌 경우,이 시간이 다형성이라고합니다. (추신 : C ++와 자바는 다형성 C에서 다양 ++ 및 Java, 다형성, 캐스트 다소 유사)
class Dog(object):
def print_self(self):
print("This is dog")
class XiaoTianQuan(Dog):
def print_self(self):
print("This is XiaoTianQuan")
def introduce(temp):
temp.print_self()
dog1 = Dog()
dog2 = XiaoTianQuan()
introduce(dog1)
introduce(dog2)
#所谓多态,即写完程序后,只是知道它调用一个方法,但是不确定它究竟是调用基类的还是调用子类的,在真正执行的一刹那,才根据当前的对象是谁去决定调用哪个方法
#因为python是动态类型的语言,所以python中的多态体现得不态明显
클래스 속성 인스턴스 속성
#需求:用一个变量存储一个类创建了多少个对象
class Tool(object):
#属性:定义在类之内,方法之外的属性称为类属性
count = 0
#方法
def __init__(self, name):
self.__name = name
Tool.count += 1 #对于类属性,用类名进行访问(就像实例对象的属性通过实例对象的名字访问一样)
tool1 = Tool("铁锹")
tool2 = Tool("共兵铲")
注意:实际上程序并不是每创建一个对象就在该对象的空间内放一个方法,而是在该空间内多了一个属性(变量),该属性可以知道这个对象的class,即保存了该类的一个引用,然后在调用该方法时到该类中查找该方法。故而一个抽象的类实际上也占用了内存空间,亦即类在程序里面也是一个对象,这个对象称为类对象,通过类创建出来的对象称为实例对象,实例对象里面的属性称为实例属性,类里面的属性称为类属性。
주의 : 오브젝트 인스턴스는 특성과 관련된 데이터를 상기 오브젝트의 인스턴스와 다른 예는 공유하지 속성이다. class 속성에 속하는 클래스의 목적은, 동일한 속성 클래스 인스턴스 오브젝트의 복수의 사이에서 공유 될 수있다. 클래스 정의의 클래스 속성은 한 번만 개체의 인스턴스를 생성과는 아무런 정의 할 수 없습니다.
- 예 속성
없음 이름 속성이 클래스 초기화를 정의하지 가정하고, 그 다음 예 인스턴스로서 지칭 객체를 생성 할 수 속성 __init__ 방법 및 후속 속성과 (예를 들면 속성 S.name 이러한 의해 = "개" 방법 속성은 인스턴스 속성을 생성하고, init 메소드에 정의 된 속성) 인스턴스 속성 속하는
방법 클래스 방법, 고정 방법 으로서는
참고 :实例方法中的第一参数为self只是大家都遵循的一个规则,同时,类方法中的第一个参数cls也只是大家都遵循的规则
class Game(object):
#类属性
num = 0
#实例方法
def __init__(self):
self.name = "laowang"
#在方法前加了@classmethod的都称为类方法
@classmethod #装饰器
def add_num(cls): #不同于实例方法中必须有self参数保存该对象(实例),cls就是用来保存类的引用的,是class的简写。
cls.num = 100
= 게임 게임 ()
# 클래스 메서드 Game.add_num ()이 클래스의 이름으로 호출 할 수 있습니다. 또한 클래스 메서드를 호출하기 위해이 클래스 객체에 의해 만들 수 있습니다 (개인 이해의 클래스 객체 인스턴스가 생성되고, 또한 클래스를, 그래서이 클래스의 메소드를 호출 할 수 있습니다)
인쇄 (Game.num)
참고 : 실제 개발을 미래에, 당신은 일반적인 범주를 통해 클래스를 수행하려는 경우, 당신은 일반적인 기능을 통해 기능을 수행하려는 경우. 그 클래스는 물고기도 새도있는 기능을 가지고있다
단일 디자인 패턴
class S:
__instance = None
def __new__(cls, *args, **kwargs):
if S.__instance is None: #类属性通过类名访问
S.__instance = super().__new__(cls) #因为自己重写了__new__方法(分配内存的),所以必须调用父类的__new__()以分配内存
return S.__instance #ps:也可以写成:return cls.__instance
s1 = S()
s2 = S()
print(id(s1),id(s2)) #会发现两个对象的内存地址相同,即他们是同一个对象
#拓展:只初始化一次对象
class S:
__instance = None
__init_flag = False
def __new__(cls, *args, **kwargs):
if S.__instance is None: #类属性通过类名访问
S.__instance = super().__new__(cls) #因为自己重写了__new__方法(分配内存的),所以必须调用父类的__new__()以分配内存
return S.__instance #ps:也可以写成:return cls.__instance
def __init__(self,name):
if Dog.__init_flag == False:
self.name = name
Dog.__init_flag = True